c语言小问题,快来拿分~~~~

来源:百度知道 编辑:UC知道 时间:2024/05/05 04:37:10
a=5,b=(a++)+(++a)+(a++) ,问b等于多少?
就这么写的话电脑显示答案是18
但是要是再写个c=a++;b=(a++)+(++a)+c 的话 答案就是19
我实在是弄不明白~~~~
请详细说明~~尤其是第一个

先明确3个概念:
1.
这个结果和编译器对于加法运算的结合方式是有关系的,
你所列的结果只对于右结合的编译器正确,也就是对于从右向左进行加法运算的编译器正确

2.
先不考虑++处理,
b=a1+a2+a3
上面这个语句是先进行加法,最后进行赋值处理的
再考虑++处理,
++处理的优先级比+高,
所以b=(a++)+(++a)+(a++) 这个处理是:
先进行所有的++处理,再进行加法处理,最后再给b赋值

3.
a是一个变量,在声明时,编译器给它分配了存储空间,
所以对于a的任何处理,不论是a++还是++a,也不论处理了几次,
都是对于同一块存储空间的处理

上面说完了,来看具体的分析:
a=5,//a的初值为5
b=(a++)+(++a)+(a++)
先从右向左处理:a++,++a,a++
a++ //先将a代入,由于整个表达式没有处理完毕,先不进行++处理
++a //先进行++处理,a的值为6,再将a代入
a++ //先将a代入,由于整个表达式没有处理完毕,先不进行++处理
所以表达式运算过程中,a的值变为6,
++处理,再进行加法处理,注意这里a变为了6,所以3个a相加的结果为18

最后将18赋给b

再看这个:
a=5 //a的初值为5
c=a++;//这个表达式处理完毕后,a的值为6,c的值为5
b=(a++)+(++a)+c
先从右向左处理:c,++a,a++
c //将c代入,c的值为5
++a //先进行++处理,a的值为7,再将a代入
a++ //先将a代入,由于整个表达式没有处理完毕,先不进行++处理
所以表达式运算过程中,a的值变为7,
++处理,再进行加法处理,注意这里a变为了7,所以2个a,1个c相加的结果为19

5+7+6=18;
b=6+7+6=19;