i++与++i的区别:通俗易懂的讲述他们的区别

最近有一位朋友问我一道题,题目是这样的:

假设所有变量均为整型,则表达式(x=2,y=5,y++,x+y)的值是( )

A. 7                     B. 8                        C.9                        D. 2

很多人不明白一个问题,因为很多人(包括老师)是这样描述的:

i++是先赋值,然后再自增;++i是先自增,后赋值

这就会产生一个小小的误区。在这个式子中,表达式y++,是在这个语句中就+1呢,还是说下一个语句中再+1?

这题的答案是8,选B。

究其原因,我觉得可以这样理解:

编程中的表达式一般情况是会有返回值的,i++与++i也不例外。

如:

int y = 3 + 2;

就可以把 3 + 2 看作表达式,计算结果赋值给 y。

同理,我们就可以理解为:

i++与++i都能将变量i自增1,但是在此之前:

i++ 表达式在自增的同时,返回值为 i 

++i 表达式在自增的同时,返回值为 i+1

这两句话非常重要,如果用这个结论再看其它的题目时,发现毫无难度!

如:

int a = 1;
int b;
b = a++;
// b 为 1

由于a++的返回值是a,赋值给了b。所有b的值是此时a的值。

如:

int a = 1;
int b;
b = ++a;
// b 为 2

由于++a的返回值是a+1,赋值给了b。所有b的值是此时a+1的值。

在输出也一样,如:

int a = 1;
printf("%d\n",a++);
// 输出1

由于a++是 printf 函数的参数,所以输出的是 a++表达式 的返回值,也就是a

如:

int a = 1;
printf("%d\n",++a);
// 输出2

由于++a是 printf 函数的参数,所以输出的是 ++a表达式 的返回值,也就是a+1

当然,如果没有人使用到他们的返回值的时候,他们的效果完全相同

如:

int a = 1;
a++;

int a = 1;
++a;

现在再看看刚开始的那道题:

假设所有变量均为整型,则表达式(x=2,y=5,y++,x+y)的值是( )

A. 7                     B. 8                        C.9                        D. 2

可以看作 y++ 在表达式中但是没有人使用到他的返回值。

所以此刻 y++ 与 ++y 是完全相同的,它仅仅做了 y+=1 的操作罢了!

毫无疑问,这题 2 + 6 = 8 !

我还用C语言的函数模拟了一下 i++ 和 ++i 内部的操作:

/**
 * 相当于i++的函数
 * @return i
 */
int iPlusPlus(int * i){
    *i = *i + 1;
    return *i;
}

/**
 * 相当于++i的函数
 * @return i+1
 */
int plusPlusI(int * i){
    *i = *i + 1;
    return *i+1;
}

创作不易,喜欢的话给个赞趴!有错误也欢迎在评论区指出奥!

猜你喜欢

转载自blog.csdn.net/m0_46745664/article/details/125572300