首先我们看逗号表达式:
格式:表达式1,表达式2,...表达式n;
它的原理是这样的,执行表达式1,再执行表达式2,一次类推。。。一直执行到表达式n;
但是最后整条语句的最终结果取表达式n的值;
比如,有一个这样的语句:a = (1,2,3);那a的值最终结果为3;
因此(++a,b++,b++)此表达式的最终取值,从形式上看是取决于表达式3的b++(还有其他细节,后面讲);
所以我们把printf("%d %d",(++a,b++,b++),b++);这条语句化简为:
printf("%d %d", b++, b++);
再来看++的运算符,当它被加在变量前表示,“变量先计算后使用”,加在变量后表示“变量先使用后计算”;
所以再次将以上语句printf("%d %d", b++, b++);化简为:
printf("%d %d", b, b);
可是这样看来好像最后输出结果应该是-3,而不是-2,是怎么回事呢?别急,还有一个细节要讲:
其实在逗号表达式的运算过程中,无论表达式是什么形式,它都会展开进行运算完毕后在进入下一个表达式进行运算。是什么意思呢?举一个例子吧:
比如表达式是这样的:(a = 1, a++ , a),这个表达式,展开后是这样的(a = 1,a = a + 1,a),它从左往右执行的时候,其实a的值已经在第二个表达式进行运算过,并且值已经重新存储过了此时a的值变成了2。因此,在第三个表达式的时候,其实a的值已经变成了2;
回到原题,在这条语句printf("%d %d",(++a,b++,b++),b++)的逗号表达式(++a,b++,b++)中,在第二个表达式运算时,其实已经将b值改变了,此时b已经变成了-2,而我们的化简printf("%d %d", b++, b++);中又由于 受到++运算“变量先使用后计算”的原则,因此会先将-2输出到屏幕中(虽然b的最终存储的值为-1);
同理,可以推得
int a=5,b=-3,c=4;
printf("%d %d",(++a,b++),b++);
它的等效程序化简过程如下:
(++a,b++),它的最终结果去看它的第二个表达式 b++; ++a,可以去除,
因此得到:
printf("%d %d", b++, b++);
在根据“先使用后计算的原则”再化简为:
printf("%d %d", b, b);
b = b+1;
b = b+1;
因此虽然b的值最终存放为-1,但是在打印输出的值为-3,-3;
我再补充一点,关于你的这道题不存在printf这个函数是从左往右还是从右往左算的问题,这道题无论是从哪里开始计算,结果都是一样的。
假如题目改成这样:
printf("%d %d",(++a,b++,++b),b);
如果是从左往右算,那输出结果是 -1, -1;
如果是从右往左算,那输出结果是 -3, -1;
温馨提示:答案为网友推荐,仅供参考