C语言中 int a=5,b=-3,c=4;printf("%d %d",(++a,b++,b++),b++);为什么结果是-2 -2?

int a=5,b=-3,c=4;printf("%d %d",(++a,b++),b++);为什么结果就变成-3 -3?

首先我们看逗号表达式:
格式:表达式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;
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-03
#include <stdio.h>
int main(void)
{
    int a=5,b=-3;
    
    printf("%d %d",(++a,b++),b++);
    
    return 0;
}
 
//gcc编译结果
gcc -Wall -ansi -S -o m.s main.c 
main.c: 在函数‘main’中:
main.c:9: 警告:‘b’上的运算结果可能是未定义的

andl $-16, %esp
subl $32, %esp
movl $5, 24(%esp) //a = 5
movl $-3, 28(%esp) //b = -3
movl 28(%esp), %ecx //printf最右边参数 b = -3
addl $1, 28(%esp) //b ++ b = -2
addl $1, 24(%esp) //a ++ a = 6
movl 28(%esp), %edx //printf倒数第二个参数 b = -2
addl $1, 28(%esp) //b++
movl $.LC0, %eax //准备printf参数%d %d
movl %ecx, 8(%esp) //以下是参数入栈
movl %edx, 4(%esp)//就是将ecx eax edx的值压栈
movl %eax, (%esp)
call printf //调用printf
//最后结果是 -2 -3
//不同的编译器处理是不一样的,不要写这种代码
//如果是考试题目,参考往年的题目跟着答案写,死记硬背

本回答被提问者采纳
第2个回答  2014-03-03
经过试验那个括号起一个运算符的作用
作用:
d=(++a,b++,b++)
d代表的是最后一个内容块,即b++,括号内前两个进行先运算得出相应的结果追问

printf("%d %d",(++a,b++,b++),b++);
中,对输出的计算是从右到左求值的,那么输出应该是-2 -3啊

追答

(++a,b++,b++)代表的是最后一个内容块,即b++
括号内前两个进行先运算得出相应的结果
也就是说你那句相当于
++a;
b++;
printf("%d%d",b++,b++);

追问

先看这个
void main()
{
int a=1,b=2,c=3;
printf("%d %d %d",b,a+++b++,++b+c);
}
结果是3 4 6 所以是从右向左算的

追答

抱歉,能力有限

第3个回答  2014-03-03
(++a,b++)这里面是逗号表达式,也就是说只是输出b++这个表达式,由于是后缀因此输出的当然是-3追问

printf("%d %d",(++a,b++,b++),b++);
为什么是-2 -2? 谢谢你的回答,没有财富值了,不然就给你了

第4个回答  2014-03-03
这水平先学易语言吧

如果有"int a=5,b=3;"那么在执行“!a&&b++"之后,a和b的值分别是多少?为...
a = 5, b =3!a = 0,但是只是一个临时值,a并没有再被赋值&& 左边不成立的话就不会 执行右边的b++因此b++ 没有执行,自然b的值没改变另外(|| 左边不成立的话,才会继续执行右边的代码) 已赞过 已踩过< 你对这个回答的评价是? 评论 收起 tlptjsj3721 2012-03-19 · 超过14用户采纳过TA的回答...

在c语言中int a=5;printf("%d %d",++a,a++);答案是6 和5,为什么不是6...
printf()在对逗号后面的数据处理时是按照从右往左的顺序的,即先执行a++,再执行++a,这样,输出的第二个数就是5了,而在执行++a时,c语言中并不认为这是第二次使用a(这段执行过程最好看汇编),所以执行的其实是5+1,所以输出的第二个数是6 其实你可以试一下printf("%d %d",++a,++a)...

C语言 int a; a=5; printf("a=%d\\n",++a); printf("a=%d\\n",a++...
比如a = 1 ++a 这个表达式返回2 a的值为2 a = 1 a++这个表达式返回1 a的值为2 就是a++ ++在后面返回的是a加之前的值 ++a ++在前返回的是a加之后的值 你上面的例子 printf("a=%d\\n",++a); ++a应该返回6 执行这行后a = 6 printf("a=%d\\n",a++); a++...

main() { int a=5; float b=4.,c; c=a++\/--b; printf("%f,%f,%d\\n...
所以:1、c=a++\/--b=5\/3=1.666667,计算后a的值为6.2、在printf语句中,先计算a%4,求余,6%4=2;3、接着计算a++\/--b=6\/2=3,然后a的值变为7 综上:所以结果为1.666667,3.000000,2

int a=5,b; b=++a*++a ;printf(“%d”,b);
49 先逐步自增再统一取值

...main() { int a=5,c; c=(a+=a++); printf("%d,%d\\n",c,a); }...
关键在于这一语句的理解 c=(a+=a++);1、先看右边括号中的 a+=a++,对于它,再看等号右边,右边 a 先执行运算,再加1,所以先执行a+=a; 得到a=10,将a的值赋于c 2、再执行a++,10加1就得到了11

在C语言的环境下,a=5;b=a++;c=--a-b++;d=(a++)-(++b)+c--;结果是多少...
然后进行第三步“c=--a-b++”,首先--为前缀,所以先运算--a,结果a=5,由于++为后缀,所以接下来先运算c=a-b,结果c=5-5.为0,最后进行b++运算,结果b=6 最后一步“d=(a++)-(++b)+c--”,先运算括号里面的“a++”和“++b”,结果a=6,b=7,由于--为后缀,所以...

...设a=3,b=-4,c=5; 请问大师表达式++a-c+(++b)和表达式++a-c+++b...
等价于 (++a)-(c++)+b 结合性是尽可能地跟前面的结合;所以有 (++a)-(c++)+b 先算前置的,再算表达式的,再算后置的。(++a)-c+(++b)a=a+1;b=b+1;a-c+b;这就是表达式++a-c+(++b) 的值;(++a)-(c++)+b a=a+1;a-c+b;这就是表达式++a-c+++b的值,c=c+1;...

int a=5; printf(“%d”,a++);
a++是先输出上次的结果,下次的时候才按加1算的!++a则是本次就输出加1后的结果。

若有定义语句int a=5,则表达式:a++的值是 答案是5,为什么不是6呢,我...
那个表达式的值的确是5,但是那个表达式之后a就为6了。

相似回答