y=(++x)+(x++)+(--x) 对++x, x的值变为2,同时,第一部分的值是2,对第二部分,x++,先用x的值,即第二部分的值为2(此时X还没执行++操作),第三部分,——x, X的值由2变为1,即第三部分的值为1,故y的值是5,, 同时,在执行完第三部分,即x已被用完,再由第二部分的x++,x由1变为2,故x的值为2.
第二题,010表示的是8进制。
你们老师是白痴么,让你们做这种题目,C标准中,求值顺序未定义,所以y=(++x)+(x++)+(--x);这一句y值的结果是不定的,不同编译器下可能会有不同的结果,即便是同一编译器,不同编译选项下也可能会产生不同结果,但是最后x的值是固定的2
下面贴出VC6默认编译选项下,debug模式下的反汇编结果
5: y=(++x)+(x++)+(--x);
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax
00401038 mov ecx,dword ptr [ebp-4]
0040103B add ecx,dword ptr [ebp-4]
0040103E mov edx,dword ptr [ebp-4]
00401041 sub edx,1
00401044 mov dword ptr [ebp-4],edx
00401047 add ecx,dword ptr [ebp-4]
0040104A mov dword ptr [ebp-8],ecx
0040104D mov eax,dword ptr [ebp-4]
00401050 add eax,1
00401053 mov dword ptr [ebp-4],eax
做这种标准中未定义的题目毫无意义,实际开发中,没有人会写这种代码,写这种代码的人会直接被boss fire掉
第二题,printf("%d,%d\n",x++,y--);自增自减运算符后缀,传入的参数是原参数010和10,但是该剧语句执行后x和y会分别自增一,自减一
6: printf("%d,%d\n",x++,y--);
00401036 mov eax,dword ptr [ebp-8]
00401039 mov dword ptr [ebp-0Ch],eax
0040103C mov ecx,dword ptr [ebp-0Ch]
0040103F push ecx
00401040 mov edx,dword ptr [ebp-4]
00401043 mov dword ptr [ebp-10h],edx
00401046 mov eax,dword ptr [ebp-10h]
00401049 push eax
0040104A push offset string "%d,%d\n" (0042201c)
0040104F mov ecx,dword ptr [ebp-4]
00401052 add ecx,1
00401055 mov dword ptr [ebp-4],ecx
00401058 mov edx,dword ptr [ebp-8]
0040105B sub edx,1
0040105E mov dword ptr [ebp-8],edx
00401061 call printf (004010a0)
00401066 add esp,0Ch
y=(++x)+(x++)+(--x);
第一个++x,先把x加1,然后参加运算,此事x变为2.
第二个x++,x先参加运算,运算完了再加1,相当于2+2,运算完了之后x为3.
第三个--x,此时x为3,先对x进行自减1,x变为2,然后参加运算,相当于3+2.
所以最后x是2,y是5.
++x,先+再赋值
x++,先取值再+
所以y1=2,y2=2,y3=1
第二个8应该是8进制,然后先赋值就是打印8和10,之后再运算
自加自减在后没有影响……所以你前面的y=(++x)+(x++)+(--x)=2+2+1=5
至于后面的,如果你把“int x=010”改成“int x=10”就对了……前面多了一个“0”,x的值就变成8进制的了……于是输出变成8~
运算符的优先级吧,很重要的,自己好好研究下
哇塞 这坑爹的吧