沧海雨季 发表于 2017-7-10 08:09:54

新人求教,关于自增自减运算符

#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呢?

沧海雨季 发表于 2017-7-10 09:34:21

#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 10:37:18

本帖最后由 ba21 于 2017-7-10 14:41 编辑


不同的编译器运算结果有差别。总的而言要看运算的优先循序。

人造人 发表于 2017-7-10 10:51:32

#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

ba21 发表于 2017-7-10 12:43:19

人造人 发表于 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

人造人 发表于 2017-7-10 13:10:16

ba21 发表于 2017-7-10 12:43
vc++ 6.0

怎么了?

ba21 发表于 2017-7-10 13:31:11

人造人 发表于 2017-7-10 13:10
怎么了?

你得到的是24 ; 我这是22 不应该呀。

人造人 发表于 2017-7-10 14:09:35

ba21 发表于 2017-7-10 13:31
你得到的是24 ; 我这是22 不应该呀。

正常

BngThea 发表于 2017-7-10 14:25:52

不建议用这种“折磨人”的写法,语义不明,除了考试毫无用处
更重要的是,不同编译器的翻译也有区别,导致其计算结果存在区别。

沧海雨季 发表于 2017-7-16 22:20:32

人造人 发表于 2017-7-10 10:51
自己看吧

谢谢啦~貌似这是编译器的求值顺序问题。。它只能保证j最终是8来的。还有汇编语句看不懂{:10_269:}

沧海雨季 发表于 2017-7-16 22:21:23

ba21 发表于 2017-7-10 10:37
不同的编译器运算结果有差别。总的而言要看运算的优先循序。

恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。

ba21 发表于 2017-7-16 22:23:09

沧海雨季 发表于 2017-7-16 22:21
恩恩,貌似编译器不一样算的结果也不一样。那这种题考试遇到了怎么办呢。。。

按教课老师说的来咯。不过差不多也就2种情况。
你可以在各种编译器上都试下什么结果。
页: [1]
查看完整版本: 新人求教,关于自增自减运算符