在看了i++与++i的区别之后,我尝试自己敲代码来实践一下,可是我发现i++在printf前和在printf里进行运行结果也不相同。
求解惑
直接printf("%d",i++)等价于printf("%d",i);i=i+1; 你先i++就是相当于i=i+1后再printf("%d",i)。前者输出原来的值i=5,后者是先自加到6了再输出6。
对啊,单独写 i++ ,那么就是6
写在 printf 就是5
如果
printf("%d", ++i); 这个也是6
int main()
{
int i = 0;
//i++ = 100; //编译出错: error C2106: “=”: 左操作数必须为左值
++i = 1; //没有错误
printf("%d", i); //输出1
return 0;
}
从上面的代码情况可以认为编译器在处理i++和++i的方式不同
结论:printf()
压栈的时候,i++其实压的是中间结果的值,也就是一个常量。而++i因为计算后的结果是一个左值,故会将i对应的地址进行压栈。
问题的原因是由于i++和++i的运算规则和操作符的位置不同导致的。
i++是后加加,它的原理是先返回i的值,然后再将i加1。所以当i++放在printf语句之前时,i的值会先被输出,然后再将i加1。
而++i是前加加,它的原理是先将i加1,然后再返回i的值。所以当++i放在printf语句之前时,i的值会先被加1,然后再输出。
以下是代码示例来验证这一区别:
#include <stdio.h>
int main() {
int i = 0;
printf("%d\n", i++); // 输出0,然后i加1
printf("%d\n", i); // 输出1
printf("%d\n", ++i); // i先加1,然后输出,输出1
printf("%d\n", i); // 输出1
return 0;
}
解释: - 第一个printf语句中,先输出0,然后i的值加1变为1。 - 第二个printf语句中,输出1。 - 第三个printf语句中,i先加1变为2,然后输出2。 - 第四个printf语句中,输出2。
这个例子就展示了i++和++i在不同位置运行时得到的不同结果。通过对这些代码的分析,我们可以发现i++和++i运算符的使用需谨慎,尽量避免在同一个表达式中多次使用,以免造成代码的混乱和维护的困难。