八神 发表于 2013-7-31 16:45:16

i++和++i的区别

#include<stdio.h>
int main(void)
{
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;
}
说明一下p,q,i,j的值,为什么我编译q的值是22,书上所说的是24?到底是哪一个?请高手指点,请说明详细原因!

福禄娃娃 发表于 2013-7-31 16:45:17

本帖最后由 福禄娃娃 于 2013-7-31 20:45 编辑

编译器不同,结果可能不同。编译器优化后,指令变成了乱序执行。
使用VC6.0 q的值是22
分号是一个顺序点
尽量少使用这种多个自增的语句   不然会被编译器修改了值   定义变量的只能加上volitle防止编译器修改值.

区别就是后置i++直接算出p的值,p=5+5+5=15
前置++i 先i先自增两次i=7,再相加7+7=14,接着自增i=8,再相加 q=7+7+8=22

刚才用vs2010使用c++编译器编译的结果 q 为24,可见C和C++编译器处理方式不同,VC6.0使用的是.c,VS2010使用的是.cpp

八神 发表于 2013-7-31 19:16:09

是不是编译器有问题啊?还是有BUG啊!我想了一下午都没搞定,谁帮我啊:cry

SilverMagic 发表于 2013-7-31 19:50:33

八神 发表于 2013-7-31 19:57:04

编译器应该没问题啊!如果q = (++j) + (++j);结果就会正确q的值14,q = (++j) + (++j) + (++j);结果就变成22,问题就出现在这里!我就一直没弄明白这个原因!

黑马狼 发表于 2013-8-2 11:08:46

一个是加一后搓泥一个是处理后加一

浮游小鱼 发表于 2013-8-2 19:58:01

有意思{:1_1:}

怡静 发表于 2013-8-6 09:46:44

没想到两个++的前后区别这么大。

siqi622 发表于 2013-8-6 09:59:40

分类: 前自增 --++i
          后自增 --i++
相同: 最终都是i的值加1
不同:前自增整体表达式的值是i加1之后的值
         后自增整体表达式的值是i加1之前的值
我是C新手米以上内容是郝斌C语言有讲到的区别,记不清哪一课了,这是我做的笔记   希望能帮到你
                              

大灰先生 发表于 2013-8-6 13:55:49

领教了,真的是大神多多啊

lark 发表于 2014-6-8 23:56:31

有一点我想说.我的18,21,8,8.请教下,咋个编译器不同,连运算方式都变了:dizzy::dizzy:

lark 发表于 2014-6-9 00:10:44

#include<stdio.h>
int main(void)
{
int i = 5, j = 5, p, q;
p = (i++/*5*/) + (i++/*6*/) + (i++/*7*/);
//括号里面的是先赋值再自加1的p=5+6+7=18
q = (++j/*6*/) + (++j/*7*/) + (++j/*8*/);
//括号里面的是先自加1然后再参于运算的q=6+7+8=21
printf("%d,%d,%d,%d",p,q,i,j);
//正如前面所说反正结果都是8
return 0;
}
//不明白的是,i++,先赋值再运算,那么它是把值赋给它自己了吗?作为单独的代码,而不是类似y=i++的话.
页: [1]
查看完整版本: i++和++i的区别