在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