新人求教,关于自增自减运算符
#include <stdio.h>void main()
{
int i = 5 , j = 5 , p , q;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
为什么q的结果是22呢? #include <stdio.h>
void main()
{
int i = 5 , j = 5 , p , q;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d",p,q,i,j);
} 本帖最后由 ba21 于 2017-7-10 14:41 编辑
不同的编译器运算结果有差别。总的而言要看运算的优先循序。
#include <stdio.h>
int main(void)
{
int i = 5, j = 5, p, q;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("%d,%d,%d,%d", p, q, i, j);
return 0;
}
15,24,8,8请按任意键继续. . .
自己看吧
#include <stdio.h>
int main(void)
{
010C4010xchg ax,ax
010C4012push ebp
010C4013mov ebp,esp
010C4015sub esp,0F0h
010C401Bpush ebx
010C401Cpush esi
010C401Dpush edi
010C401Elea edi,
010C4024mov ecx,3Ch
010C4029mov eax,0CCCCCCCCh
010C402Erep stos dword ptr es:
int i = 5, j = 5, p, q;
010C4030mov dword ptr ,5
010C4037mov dword ptr ,5
p = (i++) + (i++) + (i++);
010C403Emov eax,dword ptr
010C4041add eax,dword ptr
010C4044add eax,dword ptr
010C4047mov dword ptr ,eax
010C404Amov ecx,dword ptr
010C404Dadd ecx,1
010C4050mov dword ptr ,ecx
010C4053mov edx,dword ptr
010C4056add edx,1
010C4059mov dword ptr ,edx
010C405Cmov eax,dword ptr
010C405Fadd eax,1
010C4062mov dword ptr ,eax
q = (++j) + (++j) + (++j);
010C4065mov eax,dword ptr
010C4068add eax,1
010C406Bmov dword ptr ,eax
010C406Emov ecx,dword ptr
010C4071add ecx,1
010C4074mov dword ptr ,ecx
010C4077mov edx,dword ptr
010C407Aadd edx,1
010C407Dmov dword ptr ,edx
010C4080mov eax,dword ptr
010C4083add eax,dword ptr
010C4086add eax,dword ptr
010C4089mov dword ptr ,eax
printf("%d,%d,%d,%d", p, q, i, j);
010C408Cmov eax,dword ptr
010C408Fpush eax
010C4090mov ecx,dword ptr
010C4093push ecx
010C4094mov edx,dword ptr
010C4097push edx
010C4098mov eax,dword ptr
010C409Bpush eax
010C409Cpush offset string "%d,%d,%d,%d" (010C6BCCh)
010C40A1call _printf (010C1361h)
010C40A6add esp,14h
return 0;
010C40A9xor eax,eax
}
010C40ABpop edi
}
010C40ACpop esi
010C40ADpop ebx
010C40AEadd esp,0F0h
010C40B4cmp ebp,esp
010C40B6call __RTC_CheckEsp (010C1118h)
010C40BBmov esp,ebp
010C40BDpop ebp
010C40BEret 人造人 发表于 2017-7-10 10:51
自己看吧
vc++ 6.0
8: q = (++j) + (++j) + (++j);
0040105D mov ecx,dword ptr
00401060 add ecx,1
00401063 mov dword ptr ,ecx
00401066 mov edx,dword ptr
00401069 add edx,1
0040106C mov dword ptr ,edx
0040106F mov eax,dword ptr
00401072 add eax,dword ptr
00401075 mov ecx,dword ptr
00401078 add ecx,1
0040107B mov dword ptr ,ecx
0040107E add eax,dword ptr
00401081 mov dword ptr ,eax
9: printf("%d,%d,%d,%d", p, q, i, j);
00401084 mov edx,dword ptr
00401087 push edx
00401088 mov eax,dword ptr
0040108B push eax
0040108C mov ecx,dword ptr
0040108F push ecx
00401090 mov edx,dword ptr
00401093 push edx
00401094 push offset string "%d,%d" (0042201c)
00401099 call printf (004010e0)
0040109E add esp,14h
ba21 发表于 2017-7-10 12:43
vc++ 6.0
怎么了? 人造人 发表于 2017-7-10 13:10
怎么了?
你得到的是24 ; 我这是22 不应该呀。 ba21 发表于 2017-7-10 13:31
你得到的是24 ; 我这是22 不应该呀。
正常
不建议用这种“折磨人”的写法,语义不明,除了考试毫无用处
更重要的是,不同编译器的翻译也有区别,导致其计算结果存在区别。 人造人 发表于 2017-7-10 10:51
自己看吧
谢谢啦~貌似这是编译器的求值顺序问题。。它只能保证j最终是8来的。还有汇编语句看不懂{:10_269:} ba21 发表于 2017-7-10 10:37
不同的编译器运算结果有差别。总的而言要看运算的优先循序。
恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。
沧海雨季 发表于 2017-7-16 22:21
恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。
按教课老师说的来咯。不过差不多也就2种情况。
你可以在各种编译器上都试下什么结果。
页:
[1]