下文中的序列点该怎么理解?

Jarrylogin 2007-05-15 10:34:59
使用我的编译器,下面的代码int i=7; printf("%d\n", i++ *
i++); 返回49?不管按什么顺序计算, 难道不该打印出56吗?
尽管后缀自加和后缀自减操作符++ 和-- 在输出其旧值之后才会执行运算,
但这里的“之后”常常被误解。没有任何保证确保自增或自减会在输出变量原值之
后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表
达式“完成” (按照ANSI C 的术语, 在下一个“序列点” 之前, 参见问题3.7) 之前
的某个时刻进行。本例中, 编译器选择使用变量的旧值相乘以后再对二者进行自
增运算。
...全文
257 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-05-15
  • 打赏
  • 举报
回复
这样的代码,执行结果将依赖于环境 ...
xiantongyuan 2007-05-15
  • 打赏
  • 举报
回复
这个在很多书上都有说明了,这和具体的编译器实现有关系的,所以建议lz不要写出这样容易混淆的代码。
如果非要解释的话,只能说在你这是:先取出i,即i = 7;然后执行 i * i = 49;最后让i++两次,即i = 9;
BluntBlade 2007-05-15
  • 打赏
  • 举报
回复
注意,是表达式“求值”而不是表达式“计算”,所以就算不写算术表达式,也有可能会遇上副作用问题。比如函数参数求值过程。
cmail 2007-05-15
  • 打赏
  • 举报
回复
你别写这种代码就是了
它这里是先i*i了,再i自增两次.
BluntBlade 2007-05-15
  • 打赏
  • 举报
回复
“序列点”是指当执行流到此处的时候,所有的表达式求值副作用均已完成(比如自增、自减)。
  • 打赏
  • 举报
回复
我觉得也是47,在当前行i始终是7
下一行的时候才是9
不过我觉得不应该写出这种代码
wingfiring 2007-05-15
  • 打赏
  • 举报
回复
不知道C中应该是怎样的行为了.但是,在C++中,标准明确了:
undefined behaviour
contain_universe 2007-05-15
  • 打赏
  • 举报
回复
规范代码吧
这个讨论一下就好

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧