鱼C论坛

 找回密码
 立即注册
查看: 1547|回复: 3

[技术交流] 关于(i++) + (++i)的结果和类似问题

[复制链接]
发表于 2014-8-26 22:08:25 | 显示全部楼层 |阅读模式

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

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

x
在这里, 我可以很明确告诉大家
结果无定义, 什么结果看编译器
原因是C/C++标准不对除了某些运算符之外的其他运算符操作数的求值顺序作规定
(i++) + (++i)
也就是说编译器可以任意选择, 先算i++或者先算++i, 再相加求值
类似问题还有
int f() { return 1; }
int g() { return 2; }
printf("%d, %d", f(), g());
这个的输出是什么? 1, 2还是2, 1?
答案是: 都有可能
虽然参数压栈顺序是从右到左, 但是求值顺序仍然没有定义, 所以编译器可以先执行f()再执行g()或者先执行g(), 再执行f()
明确定义有求值顺序的操作符有:
&&(左操作数先求值)
||(同上)
,
? :
逗号操作符合三目运算符的? :操作符的具体求值顺序忘了, 大家可以自己查查, 不排除我遗漏了某个操作符的可能性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-27 11:09:42 | 显示全部楼层
上面的内容有一些错误
int f()
{ printf("f()"); return 1;}
int g()
{ printf("g()"); return 2; }
上面的f()和g()应该是这样的
输出是无明确定义的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-8 15:44:41 | 显示全部楼层
类似问题还有
int f() { return 1; }
int g() { return 2; }
printf("%d, %d", f(), g());
这个的输出是什么? 1, 2还是2, 1?
答案是: 都有可能

楼主不懂不要乱说
这里绝对会输出 1, 2
没有第二种可能
不管是 f()先调用 还是 g先调用
f先调用 会变成这样
printf(..... 1, g());
然后
printf(.... 1, 2);

如果是g先调用
那就是
printf(..... f(), 2);
然后
printf(..... 1, 2);
结果都是 一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-8 15:45:57 | 显示全部楼层
对于 2# 的纠正
那也只是 先输出 f() 还是 先输出 g() 无法确定
最终输出 1, 2 这个是不会有区别的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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