午饭加肉丝 发表于 2017-11-16 21:09:27

++i和i++的使用

int main(void) {
    int a =1;
    int b =0;
    b = (a++)+(++a)+(++a);
    printf("b的值为%d,a的值为%d",b,a);
    return 0;
}

结果为:b的值为8,a的值为4


疑问: 执行的顺序是什么?
自己认为的执行顺序:
1.++a    a变成2
2.++a        a变成3
3. 执行   b = 3 + 3 +3 =9
4.a++    a变成4
结果为 b=9        a =4

BngThea 发表于 2017-11-16 21:45:01

后面两个++a先执行,分别得到3+2然后再+3得到8赋值给b最后a++得a等于4

午饭加肉丝 发表于 2017-11-16 22:08:57

BngThea 发表于 2017-11-16 21:45
后面两个++a先执行,分别得到3+2然后再+3得到8赋值给b最后a++得a等于4

你的意思 是不是第一个 ++a 使得a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成
3+2+3呀??

午饭加肉丝 发表于 2017-11-16 22:11:04

午饭加肉丝 发表于 2017-11-16 22:08
你的意思 是不是第一个 ++a 使得a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成 ...

如果是的话,那 y= (++x)+(++x)+(++x), x=1;执行后的结果应该为2+3+4,但编译器是12. 我想了好久了,想到哭啊,

3-3 发表于 2017-11-16 22:45:02

各个编译器的处理过程是不同的。
在VC6.0中b = (a++)+(++a)+(++a) 最终结果为7,假设b = (i++)+(++j)+(++k),i = j = k = 0, (字母进行区别主要为了说明),那么执行时,首先执行 ++j,然后将 i 与++j进行相加,即 sum = i + (++j) =0 +1, 再将 sum = sum + (++k) = 1 + 1, 然后 i才++。这是我反编译看到的结果。其它编译器应该还有其它结果。
尽量不要这样写代码。

BngThea 发表于 2017-11-16 22:53:09

午饭加肉丝 发表于 2017-11-16 22:08
你的意思 是不是第一个 ++a 使得a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成 ...

因为不同编译器会对这样的代码进行所以得"优化",实际执行起来不同编译器会得到不同结果,我跟你的解答是为了得到8而进行的一种可能得优化结果

所以这样的代码在实际中应该尽量避免,于人于己都没什么好处,也就某些考试才会要求去考虑这样的代码

A.aron 发表于 2017-11-18 11:23:45

++i是先i=i+1 然后再调用i,i++ 则是先调用i

echo000 发表于 2017-11-18 20:31:36

额应该是1+3+4吧
事实上编译器是两个两个的运算
也就是(a++)+(++a)+(++a)就相当于((a++)+(++a))+(++a)
第一个a++==1a==2
然后++a==3
再++a==4
所以是1+3+4啊
如果你试试(++a)+(++a)+(++a) a=5结果会是22的一样的道理也就是7+7+8
详细的你可以看看这个http://bbs.fishc.com/forum.php?mod=viewthread&tid=98824

陪你看雪 发表于 2017-11-18 20:54:02

感觉计算机二级才会考这种题

lfjking 发表于 2017-11-18 21:14:39

这两个 你可以看作是两 不同的 函数 来用 就可以了
如:
int(int& n)++
{
inttemp = n;
n = n + 1;
return temp;
}

int++(int& n)
{
n = n + 1;
return n;
}

zqianglh 发表于 2017-11-19 00:57:38

本帖最后由 zqianglh 于 2017-11-19 01:01 编辑

午饭加肉丝 发表于 2017-11-16 22:11
如果是的话,那 y= (++x)+(++x)+(++x), x=1;执行后的结果应该为2+3+4,但编译器是12. 我想了好久了 ...

2+3+4也是对的
4+4+4

1+3+4
1+1+1+1

诺殇丨 发表于 2017-11-19 15:36:40

午饭加肉丝 发表于 2017-11-16 22:11
如果是的话,那 y= (++x)+(++x)+(++x), x=1;执行后的结果应该为2+3+4,但编译器是12. 我想了好久了 ...

我个人觉得是(1+1)+(2+1)+(5+1).每次调用前缀++前对x加一在进行加法运算
页: [1]
查看完整版本: ++i和i++的使用