在C中使用宏时输出中的一些错误

我的代码是: –

#include #include #define sq(x) x*x*x void main() { printf("Cube is : %d.",sq(6+5)); getch(); } 

输出是: –

 Cube is : 71. 

现在请帮我解释为什么输出是71而不是1331 ……

先感谢您。

你需要在参数周围加括号。

 #define sq(x) ((x)*(x)*(x)) 

如果没有括号,表达式将扩展为:

 6+5*6+5*6+5 

你可以看到它为什么评价为71

更安全的解决方案是使用内联函数。 但是,您需要为每种类型定义不同的一个。 重命名宏也可能更清楚。

 static inline int cube_int (int x) { return x*x*x; } 

始终用括号屏蔽宏参数:

 #define sq(x) ((x) * (x) * (x)) 

考虑没有括号的评估:

 6 + 5 * 6 + 5 * 6 + 5 

并且回想一下*具有比+更高的优先级,所以这是:

 6 + 30 + 30 + 5 = 71; 

如果您还没有了解优先规则: http : //en.cppreference.com/w/cpp/language/operator_precedence

如果您像这样定义宏:

 #define sq(x) x*x*x 

并称之为:

 sq(6+5); 

预处理器将生成以下代码:

 6+5*6+5*6+5 

也就是说,由于运算符优先级,相当于:

 6+(5*6)+(5*6)+5 

这就是为什么,宏参数必须用括号括起来:

 #define sq(x) (x)*(x)*(x) 

这样预处理器输出变为:

 (6+5)*(6+5)*(6+5) 

但是,如果您传递一些带有副作用的参数,例如(i ++):

 sq(i++) 

它将扩展为:

 (i++)*(i++)*(i++) 

所以,要小心,也许你需要一个function