所有C语言教科书上都讲了“++”这个运算符,放在变量前表示先加1再使用该变量,放在变量后面表示先使用该变量再加1。但是我们真的掌握了这个运算符了吗?如果你答对了下面这两个程序的输出结果,就说明你已经掌握了这个运算符的用法了。

程序1:
#include <stdio.h>

int main()
{
      int x = 1;
      int y;
      y = (x++) + (x++) + (x++);
      printf("y = %d\n", y);

      return 0;
}

程序2:
#include <stdio.h>

int main()
{
      int x = 1;
      int y;
      y = (++x) + (++x) + (++x);
      printf("y = %d\n", y);

      return 0;
}

程序1的输出结果是“y = 3”,程序2的输出结果是“y = 10”,你答对了没?
下面来分析一下这两个程序,看汇编代码是最直观最清晰的方法。

y = (x++) + (x++) + (x++);

汇编代码如下:
# 先计算三个x之和,结果为3
0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,dword ptr [ebp-4]
00401035   add         eax,dword ptr [ebp-4]

# 将3赋值给y,y=3
00401038   mov         dword ptr [ebp-8],eax

# x加1,x=2
0040103B   mov         ecx,dword ptr [ebp-4]
0040103E   add         ecx,1
00401041   mov         dword ptr [ebp-4],ecx

# x加1,x=3
00401044   mov         edx,dword ptr [ebp-4]
00401047   add         edx,1
0040104A   mov         dword ptr [ebp-4],edx

# x加1,x=4
0040104D   mov         eax,dword ptr [ebp-4]
00401050   add         eax,1
00401053   mov         dword ptr [ebp-4],eax

 

y = (++x) + (++x) + (++x);

汇编代码如下:
# x加1,x=2
0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,1
00401035   mov         dword ptr [ebp-4],eax

# x加1,x=3
00401038   mov         ecx,dword ptr [ebp-4]
0040103B   add         ecx,1
0040103E   mov         dword ptr [ebp-4],ecx

# 将两个x相加,结果为6
00401041   mov         edx,dword ptr [ebp-4]
00401044   add         edx,dword ptr [ebp-4]

# x加1,x=4
00401047   mov         eax,dword ptr [ebp-4]
0040104A   add         eax,1
0040104D   mov         dword ptr [ebp-4],eax

# 将6与x相加,结果为10
00401050   add         edx,dword ptr [ebp-4]

# 将10赋值给y,y=10
00401053   mov         dword ptr [ebp-8],edx

     总结一句话:“++”在变量之后,则在该行语句执行完成后才会执行变量加1操作;“++”在变量之前,则按照运算顺序,先加1再执行其他操作。
     经过上面的分析,应该对“++”这个运算符的用法清楚多了吧。那写出下面这几个程序输出结果应该也不成什么问题啦^_^:
程序3:
#include <stdio.h>

int main()
{
      int x = 1;
      int y;
      y = (++x) * (++x) * (++x);
      printf("y = %d\n", y); //y = 36

      return 0;
}

程序4:
#include <stdio.h>

int main()
{
      int x = 1;
      int y;
      y = (x++) * (x++) * (x++);
      printf("y = %d\n", y); //y = 1

      return 0;
}

程序5:
#include <stdio.h>

int main()
{
      int x = 1;
      int y;
      y = (x++) * (++x) * (x++);
      printf("y = %d\n", y); //y = 8

      return 0;
}

程序6:
#include <stdio.h>

int main()
{
      int x = 1;
      int y;
      y = (x++) * (x++) * (++x);
      printf("y = %d\n", y); //y = 2

      return 0;
}

程序7:
#include <stdio.h>

int main()
{
      int x = 1;
      x = (x++) * (x++) * (++x);
      printf("x = %d\n", x); //x = 4

      return 0;
}

程序8:
#include <stdio.h>

int main()
{
      int x = 1;
      x = (x++) * (++x) * (x++);
      printf("x = %d\n", x); //x = 10

      return 0;
}