C语言如何计算表达式(x++)+(++x)+(x++)

我完全没接触C今天刚买了本书看
int x=3
int y=(x++)+(++x)+(x++)
计算过程1:先执行前增量:x的值为4 这个知道递增++ x先赋值给Y然后在+1
2:然后取x的值计算表达式的值:y=4+4+4=12 (不懂)
3:最后执行后增量,x=6.
谁能帮我解释下吗? 真的看不懂,初学者。

我原来在别的贴回答过这样的问题, 这里再发一次, 如果你没看明白中间的, 你就记住开头和结尾就行了~

==========================================================

此类语法在不同的编译器上得出的结果不同!取决于不同编译器对此类语法的解析方式. 以下是两种情况, 实际上可能因为编译器众多而不只这两种.

1.对++j的处理的两种情况,一种是在表达式进行运算之前就将++j计算,然后再进行表达式运算;第二种是在表达式运算的过程当中进行++j自增并计算表达式的值。
2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。

第一种情况:
就TC来说,他是第一种,先把++j进行自增,然后再进行加法运算,而不管++j出现的顺序,比如:

m+=(j++)+(++j)+(j++);

有一个++j,所以先将j自增一次,假设j = 2,自增一次后为3,最后的运算就是:

m += 3 + 3 + 3;

而不是
m += 2 + 3 + 4, 虽然结果都是m += 9
你试着把他们的顺序换一下:
m+=(j++)+(j++)+(++j);
++j换到了后面,结果仍然是3+3+3,而不是2+2+3,

再如:
m+=(j++)+(++j)+(j++)+(++j);
++j出现了2次,那么先将j自增两次,为4,表达等价于:
m+= 4 + 4 + 4 + 4;
而不是
m+=2+3+3+4;

这个表达式的汇编:
1 inc si ;自增j
2 inc si
3 mov ax,si ;加法运算
4 add ax,si
5 add ax,si
6 add ax,si
7 add di,ax
8 inc si ;自增j
9 inc si

第1行和第2行是将++j自增,3到7行是加法运算。8、9行是j++的自增,不参与表达式的运算。

所以使用这种编译方式的编译器,++j的位置对结果无影响。

第二种情况:
VC、dev c,好像gcc也是这种情况,他是在运算过程中对++j进行运算。所以++j的位置对结果有影响。

其中VC的还比较奇特,比如
m=(j++)+(++j)+(++j)+(j++)+(j++);
的汇编:
mov eax, DWORD PTR _j$[ebp]
add eax, 1
mov DWORD PTR _j$[ebp], eax ++j;
mov ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov edx, DWORD PTR _j$[ebp]
add edx, 1
mov DWORD PTR _j$[ebp], edx ++j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov DWORD PTR _m$[ebp], ecx

结果是
m = 3 + 3 + 4 + 4 + 4 = 18
但是将其中一个++j调换顺序:
m=(j++)+(++j)+(j++)+(++j)+(j++);
结果是:
m = 3 + 3 + 3 + 4 + 4 = 17

但是
m = (j++)+(j++)+(++j)+(++j)+(j++)+(j++);
结果却是
m = 2 + 2 + 3 + 4 + 4 + 4 = 19

就是说前面两个在第二个++j之前都提前进行了++j,而第三个表达式没有。

总之比较奇特,跟VC编译器代码优化什么的有关系。而且你将VC6的编译改成release,上面第三个表达式的结果就是
m = 4 + 4 + 4 + 4 + 4 + 4 = 24,不是19了!

=============================================================
结论:
平常编程99.999%不会遇到这种情况,就算遇到了也不要这么用,不同的编译器产生的结果不同,影响你的程序的可移植性。 另外不除了因为不同的编译器结果可能不同,相同的编译器使用不同的编译选项(比如代码优化)也可能使结果不同。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-02-03
(x++)+(++x)+(x++)
先++x 所以x =4; //影响x++中的 x的值
第一个x++, 使 x = 5,但是在该表达式中参与计算的是x++前的值
第二个x++, x = 6; ..........
第2个回答  2009-02-03
不对吧!c++是先赋值后+1,++c是先+1后赋值.
y=(x++)+(++x)+(x++) 解释为:y=3+5+5=13;
最后x=6;
第3个回答  2009-02-03
跟老师说C++这里有bug,别这么写|||

C语言如何计算表达式(x++)+(++x)+(x++)
1.对++j的处理的两种情况,一种是在表达式进行运算之前就将++j计算,然后再进行表达式运算;第二种是在表达式运算的过程当中进行++j自增并计算表达式的值。2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。第一种情况:就TC来说,他是第一种,先把++j进行...

C语言(x++)+(++x)+(x++)?
x+=(x-=(x-(x--)))= x+=(x-=(x-3))= 4+=(4-=1)= 4+3=7 唔,本地g++运行结果是7.不知道怎么回事。

C语言中x=3,表达式(x++)+(x++)+(x++)等于多少,表达式(++x)+(++x)+...
(x++)+(x++)+(x++)=9,这没有什么问题,执行为3+3+3=9,最后x=6;可在不同的软件中(++x)+(++x)+(++x)的值不等,比如在Turbo C2.0中程序执行4+5+6=15;在Visual C++6.0中为5+5+6=16;有些中也有6+6+6=18的情况,但最终x一样为6。总之你明白(x++)和(++x)执行的先后顺...

c语言中,设int x=7,y;y=(x++)+(++x)的值为多少,为什么?当y=(++x...
先计算(x++),结果是7,此时x=8 再计算(++x),结果是9,此时x=10 最后计算7+9=16 先计算(++x),结果是8,此时x=8 再计算(x++),结果是8,此时x=9 最后计算8+8=16

如果x=4; (++x)+(++x)+(++x)=?
具体地,第一次执行++后,x变为5;第二次执行后,x变为6;第三次执行后,x变为7。之后,计算x+x+x。现在x是7,所以7+7+7等于21。因此,答案是21。这个例子展示了C语言中前置自增操作的特性,以及如何计算表达式的值。C语言确实有其复杂之处,但通过理解其规则,你可以解决更多问题。面对挑战...

c++编程 x++ 和++x
int z1=y-(x++); \/\/ 后缀加, 用 x 的 当前值 7, 出了表达式 后 x 自增 1.所以上式 可 分解成 2步:z1 = y-x; x=x+1; \/\/ z1 =8-7=1; x=x+1=7+1 = 8 --- int z2=y-(++x); 分解成 2步:x = x + 1 = 8+1 = 9; \/\/ x 先自增 ...

int x=5; 求 y = (++x) + (++x) + (++x) 的值
A 首先x自加3次,x为8;B 然后把8作为表达式中所有的x的值,因此三个8相加为24。如果你改成y=(x++)+(x++)+(x++)那么上面A B的顺序交换,为y=15 x最后也为8 当然这是在Turbo C或者MS C中才这样,另外的编译系统,可能不是这样。参考资料:《C程序设计第三版》谭浩强著 58页 ...

在c#中设整数x的值为5,那么执行表达式"x += (x++) + (++x)"后x的...
答案是19.分析:式子中“++”的运算符是最高级。所以先算(X++)+(++X)但是由于++是条目运算符,所以这个式子是从右到左计算顺序(一般情况是从左往右),刚开始 X=5之后(X++)=5,用完之后X=6。之后(++X)=7,X=7,所以(X++)+(++X)=5+7=12。X=X+(X++)+(++X)=7+12=19...

c语言x=++x+x++顺序?
1. 先计算++x(前缀自增x),使x的值加1,返回新值;2. 将x的旧值与x的新值相加,得到2x;3. 再计算x++(后缀自增x),使x的值再次加1,但是这里的值仍然是x的旧值;4. 最后将2x和x的旧值相加,得到2x+1。但是,请注意,C语言标准并没有规定这个表达式的计算顺序必须是如何,因此不同...

y=x++ + ++x
其实是这样的,y = (x++) + (++x),x++的值相当于原来的x(先取值,再加1)++x的值相当于在原来的x基础上加1(先加1,再取值)不是从右向左,楼主请看这个帖子你就明白了!http:\/\/zhidao.baidu.com\/question\/112455236.html

相似回答