Logic-闫 发表于 2019-1-21 00:16:33

这又是什么鬼?

#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);
}
程序运行得
18
22
8
8
可是我口算的结果为18,21,8,8
据说不同的编译器算出来的结果不一样,可以仔细讲解一下吗?

人造人 发表于 2019-1-21 00:38:45



人造人 发表于 2019-1-21 01:02:51

p=(i++)+(i++)+(i++);
5 + 6 + 7 = 18

p=(i++)+(i++)+(i++);
5 + 5 + 5 = 15

人造人 发表于 2019-1-21 01:05:28

q=(++j)+(++j)+(++j);
8 + 8 + 8 = 24

q=(++j)+(++j)+(++j);
7 + 7 + 8 = 22

人造人 发表于 2019-1-21 01:08:03

q=(++j)+(++j)+(++j);
7 + 7 + 8 = 22


q = (   (++j) + (++j))   +(++j);

++j;
++j;
j变成了7
7 + 7 = 14

14 + (++j)
14 + 8 = 22

人造人 发表于 2019-1-21 01:08:34

   7:main.c      ****         q=(++j)+(++j)+(++j);
43                            .loc 1 7 0
44 0048 83442428                 addl        $1, 40(%esp)
44      01
45 004d 83442428                 addl        $1, 40(%esp)
45      01
46 0052 8B442428                 movl        40(%esp), %eax
47 0056 8D1400                   leal        (%eax,%eax), %edx
48 0059 83442428                 addl        $1, 40(%esp)
48      01
49 005e 8B442428                 movl        40(%esp), %eax
50 0062 01D0                   addl        %edx, %eax
51 0064 89442420                 movl        %eax, 32(%esp)

TCY 发表于 2019-1-21 10:49:10

试试这个?
#include<stdio.h>

int 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);
      return 0;
}

Logic-闫 发表于 2019-1-21 11:53:38

人造人 发表于 2019-1-21 01:08
q=(++j)+(++j)+(++j);
7 + 7 + 8 = 22



也就是说只是编译器算法的问题,对吧

人造人 发表于 2019-1-21 13:07:21

Logic-闫 发表于 2019-1-21 11:53
也就是说只是编译器算法的问题,对吧

页: [1]
查看完整版本: 这又是什么鬼?