[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问先来看表达式:a = 1b = a + (a=0,1);这个表达式的结果是1.但是我奇怪为什么不是2.我的理解是,应该按照结合律,先计算+运算符左边的子表达
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/17 11:46:27
[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问先来看表达式:a = 1b = a + (a=0,1);这个表达式的结果是1.但是我奇怪为什么不是2.我的理解是,应该按照结合律,先计算+运算符左边的子表达
[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问
先来看表达式:
a = 1
b = a + (a=0,1);
这个表达式的结果是1.
但是我奇怪为什么不是2.我的理解是,应该按照结合律,先计算+运算符左边的子表达式,获得一个值,然后计算右边的子表达式.
这样应该是先获得左边的1,然后右边执行(a=0,1)的时候虽然把a改成了0,但是也不应影响才对.
但是现在来看似乎是先执行了右边的括号,然后反过来计算a,然后计算结果?
后来我做了另一个试验,执行:
b = (a=1,printf("1:%d\n",a),a)+(a=0,printf("2:%d\n",a),a+1)
可以看到输出是:
1:1
2:0
跟我想象是一样的啊,先执行左边,a也是1,坐标的括号应该返回1,然后执行右边,a设成0,返回a+1=1,加起来应该是2才对啊,但是结果b还是1.
[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问先来看表达式:a = 1b = a + (a=0,1);这个表达式的结果是1.但是我奇怪为什么不是2.我的理解是,应该按照结合律,先计算+运算符左边的子表达
以汇编视图查看实际的操作:
1、ptr [ebp-4]置为0,ebp-4得到的是变量a的内存地址,也就是a赋值为0了.
2、寄存器EAX置为ptr [ebp-4],也就是a的值放入寄存器.
3、add eax,1,就是EAX寄存的值+1.
也就是说int b = a + (a=0,1);这条语句被理解成a=0;int b=a+1;.也不知道不同编译环境下是否还有所不同?我一开始跟楼主想得也一样,b的值应该是2.具体的原因我也很想知道,期待高手详解.不过b = a + (a=0,1);这种代码只能用来研究,不提倡实际编写,编程不是做密码,容易歧义的东西会耽误事的.