前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | 每日一面(19)

基础知识 | 每日一面(19)

作者头像
小林C语言
发布2019-12-30 15:33:17
2380
发布2019-12-30 15:33:17
举报
古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为3, 有的为 4, 哪个是正确的?

小林:没有正确答案;这个表达式无定义。同时注意,i++ 和 ++i 都不同于 i+1。如果你要使 i 自增 1, 使用 i=i+1, i+=1, i++ 或 ++i,而不是任何组合。

读者:这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可以交换 a 和 b 的值。

小林:这不具有可移植性。它试图在序列点之间两次修改变量 a, 而这是无定义的。例如,有人报告如下代码:

int a = 123, b = 7654;

a ^= b ^= a ^= b;

在 SCO 优化 C 编译器 (icc) 下会把 b 置为 123, 把 a 置为 0。

读者:我可否用括号来强制执行我所需要的计算顺序?

小林;一般来讲, 不行。运算符优先级和括弧只能赋予表达是计算部分的顺序. 在这个代码中:f() + g() * h()。尽管我们知道乘法运算在加法之前, 但这并不能说明这三个函数哪个会被首先调用。如果你需要确保子表达式的计算顺序, 你可能需要使用明确的临时变量和独立的语句。

有时候,正是那些意想不到之人,成就了无人能成之事。——图灵

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档