0%

C语言 i++和++i

C语言++i和i++的区别

​ 对于一个如此细节的问题,其实没有很大的必要来讨论,毕竟正儿八经的程序里面,按照前面说的,形成了自己的风格,基本上已经不用太多估计i++++i的区别了。

​ 但是既然聊起这个问题,最简单的区别方法相信很多人已经了然于胸了,那就是:

  • i++:先用i的值然后再加1 所以a=++i等价于:i=i+1;a=i;
  • ++ii先加1,然后在用i的值 所以a=i++等价于:a=i;i=i+1;

比如下面的代码:

1
2
3
4
5
6
   int a, b;
int i = 10;
int j = 10;

a = i++;
b = ++j;

毋庸置疑,最后的结果是a=10,b=11。这个没有问题,那么下面的这个问题呢:

1
2
3
4
int i = 10;
int j = 10;
a = (i++) + (i++) + (i++);
b = (++j) + (++j) + (++j);

你是不是也可以立即给出答案呢,但是你确定结果是这样的吗,或许你实际执行了一下,结果在不同的平台竟然不一样,比如:Linux下面得到的结果是a=30,b=37,而MacOSX编译后的结果竟然是:a=33,b=36,同一个代码,竟然有不同的结果,甚至同一个平台不同的编辑器也会有不同的结果,引起这个的原因就是C语言里的副作用,所谓的副作用(side effect)是指对数据对象或文件的修改,而这个修改可能不同的编辑器有不同的顺序,详情且听下回分解。

建议如下,对于这两个的区别,实在是如果能不用到多个++i/i++就不要用,或者等你去参加面试高速面试官这个有多个结果,分别是为何为何,亦或者是你面试别人,出个考题,保证只有一个答案的新手们,妥妥被教育,暂无他用。

举个例子源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/*beginner/operator/operator4.c*/
#include <stdio.h>

int main()
{
int a, b;
int i = 10, j = 10;

a = i++;
b = ++j;
printf("a : %d\n", a);
printf("b : %d\n", b);

i = 10;
j = 10;
a = (i++) + (i++) + (i++);
b = (++j) + (++j) + (++j);
printf("a : %d\n", a);
printf("b : %d\n", b);

return 0;
}

相应地Makefile如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#beginner/operator/Makefile

ALL : operator1 operator2 operator3 operator4

operator1: operator1.c
gcc -o operator1 operator1.c

operator2: operator2.c
gcc -o operator2 operator2.c

operator3: operator3.c
gcc -o operator3 operator3.c

operator4: operator4.c
gcc -o operator4 operator4.c

.PHONY : clean

clean:
rm -f operator1 operator2 operator3 operator4


输入make,然后./operator4输出为:

1
2
3
4
a : 10
b : 11
a : xx
b : xx

第二个结果给的是xx,因为我目前有多个答案,随你去实验吧,等下次来讲讲为何会有这几个答案。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道