作业帮 > 综合 > 作业

[C语言][表达式计算][逗号表达式]表达式计算顺序的疑问

来源:学生作业帮 编辑:搜搜做题作业网作业帮 分类:综合作业 时间:2024/05/29 03:23:02
[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语言][表达式计算][逗号表达式]表达式计算顺序的疑问

以汇编视图查看实际的操作:
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);这种代码只能用来研究,不提倡实际编写,编程不是做密码,容易歧义的东西会耽误事的.

再问: 我认为应该是有一定标准的,因为这个是考试的题目,题目的答案的确是1. 说实话我自己也很反感这个.毕竟写程序这么久都没用过这种东西..所以感觉很纳闷啊.