c - C中的x*x和(x)*(x)有什么区别?
问题描述
这个程序返回 a=25,但如果我将 sqr(x) 定义为 (x*x),它返回 a=11。为什么会这样?
#include <stdio.h>
#define sqr(x) ((x)*(x))
main (){
int a,b=3;
a=sqr(b+2);
printf("a=%d\n",a);
return 0;
}
解决方案
不同之处在于宏的扩展方式。
使用额外的括号,预处理器将表达式扩展为sqr(b+2)
:
((b+2)*(b+2))
然后编译器将其解释为:
a = ((3+2)*(3+2))
= (5*5)
= 25
如果没有额外的括号,预处理器会将表达式扩展为sqr(b+2)
:
(b+2*b+2)
编译器将其解释为:
a = (3+2*3+2)
= (3+(2*3)+2)
= (3+6+2)
= 11
(*
乘法)运算符的优先级高于+
(加法)运算符。
推荐阅读
- jmeter - 在Jmeter上所有样本结束后如何执行BeanShell PostProcessor?
- javascript - 如果位置的“id”有空间,角度数据图不会填充正确的颜色
- sql - 计算特定课程的平均时间
- vba - 如何设置列表框的默认选择并通过按键选择项目?
- r - 如何将相同的函数应用/循环到 R 中的一组相似对象
- python - 进程以退出代码 -1073741819 (0xC0000005) 完成我该如何解决这个问题
- r - 从 0:10 在 r 中线性排列值
- java - #Tablesaw #Java 导出为 csv 时,表被缩减为仅列表的最后一个元素
- c# - How do I get just the Major part of version inside AfterBuild target
- arrays - 在 Ruby 中使用数组初始化方法