3.2 int i=7;printf("%d\n",i++ * i++);返回49?

问题:

使用我的编译器,

下面的代码int i=7; printf("%d\n", i++ * i++); 返回49?

不管按什么顺序计算, 难道不该打印出56吗? 

尽管后缀自加和后缀自减操作符++ 和-- 在输出其旧值之后才会执行运算, 但这里的“之后”常常被误解。

没有任何保证确保自增或自减会在输出变量原值之后和对表达式的其它部分进行计算之前立即进行。

也不能保证变量的更新会在表 达式“完成” (按照ANSI C 的术语, 在下一个“序列点” 之前, 参见问题3.7) 之前的某个时刻进行。

本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自增运算。

包含多个不确定的副作用的代码的行为总是被认为未定义。

(简单而言, “多个不确定副作用” 是指在同一个表达式中使用导致同一对象修改两次或修改以后 又被引用的自增, 自减和赋值操作符的任何组合。这是一个粗略的定义; 严格的定 义参见问题3.7, “未定义” 的含义参见问题11.32。)

甚至都不要试图探究这些东 西在你的编译器中是如何实现的(这与许多C 教科书上的弱智练习正好相反);

正如K&R 明智地指出, “如果你不知道它们在不同的机器上如何实现, 这样的无知可能恰恰会有助于保护你。”

永不止步步 发表于01-13 11:19 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67417个|学分:379791个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号