[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问先来看表达式:a = 1b = a + (a=0,1);这个表达式的结果是1.但是我奇怪为什么不是2.我的理解是,应该按照结合律,先计算+运算符左边的子表达
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/20 13:21:14
![[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问先来看表达式:a = 1b = a + (a=0,1);这个表达式的结果是1.但是我奇怪为什么不是2.我的理解是,应该按照结合律,先计算+运算符左边的子表达](/uploads/image/z/5227970-50-0.jpg?t=%5BC%E8%AF%AD%E8%A8%80%5D%5B%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%AE%A1%E7%AE%97%5D%5B%E9%80%97%E5%8F%B7%E8%A1%A8%E8%BE%BE%E5%BC%8F%5D%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%AE%A1%E7%AE%97%E9%A1%BA%E5%BA%8F%E7%9A%84%E7%96%91%E9%97%AE%E5%85%88%E6%9D%A5%E7%9C%8B%E8%A1%A8%E8%BE%BE%E5%BC%8F%3Aa+%3D+1b+%3D+a+%2B+%28a%3D0%2C1%29%3B%E8%BF%99%E4%B8%AA%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E7%BB%93%E6%9E%9C%E6%98%AF1.%E4%BD%86%E6%98%AF%E6%88%91%E5%A5%87%E6%80%AA%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E6%98%AF2.%E6%88%91%E7%9A%84%E7%90%86%E8%A7%A3%E6%98%AF%2C%E5%BA%94%E8%AF%A5%E6%8C%89%E7%85%A7%E7%BB%93%E5%90%88%E5%BE%8B%2C%E5%85%88%E8%AE%A1%E7%AE%97%2B%E8%BF%90%E7%AE%97%E7%AC%A6%E5%B7%A6%E8%BE%B9%E7%9A%84%E5%AD%90%E8%A1%A8%E8%BE%BE)
[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);这种代码只能用来研究,不提倡实际编写,编程不是做密码,容易歧义的东西会耽误事的.