鱼C论坛

 找回密码
 立即注册
查看: 2305|回复: 11

[已解决]++i和i++的使用

[复制链接]
发表于 2017-11-16 21:09:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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
最佳答案
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加一在进行加法运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 21:45:01 From FishC Mobile | 显示全部楼层
后面两个++a先执行,分别得到3+2然后再+3得到8赋值给b最后a++得a等于4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 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呀??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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. 我想了好久了,想到哭啊  ,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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才++。  这是我反编译看到的结果。其它编译器应该还有其它结果。  
尽量不要这样写代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 22:53:09 From FishC Mobile | 显示全部楼层
午饭加肉丝 发表于 2017-11-16 22:08
你的意思 是不是  第一个 ++a 使得  a变成了2 ,然后再执行 ++a ,a变成3 ,变成 2+3 ,然后计算a++,变成 ...

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

所以这样的代码在实际中应该尽量避免,于人于己都没什么好处,也就某些考试才会要求去考虑这样的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-18 11:23:45 | 显示全部楼层
++i  是先i=i+1 然后再调用i,i++ 则是先调用i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 20:31:36 | 显示全部楼层
额  应该是1+3+4吧
事实上编译器是两个两个的运算
也就是(a++)+(++a)+(++a)就相当于((a++)+(++a))+(++a)
第一个a++==1  a==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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 20:54:02 | 显示全部楼层
感觉计算机二级才会考这种题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 21:14:39 | 显示全部楼层
这两个 你可以看作是两 不同的 函数 来用 就可以了
如:
int  (int& n)++
{
int  temp = n;
n = n + 1;
return temp;
}

int  ++(int& n)
{
n = n + 1;
return n;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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加一在进行加法运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 01:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表