首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

下文中的序列点该如何理解

2012-04-04 
下文中的序列点该怎么理解?使用我的编译器,下面的代码inti7printf( %d\n ,i++*i++)返回49?不管按什么

下文中的序列点该怎么理解?
使用我的编译器,下面的代码int   i=7;   printf( "%d\n ",   i++   *
i++);   返回49?不管按什么顺序计算,   难道不该打印出56吗?
尽管后缀自加和后缀自减操作符++   和--   在输出其旧值之后才会执行运算,
但这里的“之后”常常被误解。没有任何保证确保自增或自减会在输出变量原值之
后和对表达式的其它部分进行计算之前立即进行。也不能保证变量的更新会在表
达式“完成”   (按照ANSI   C   的术语,   在下一个“序列点”   之前,   参见问题3.7)   之前
的某个时刻进行。本例中,   编译器选择使用变量的旧值相乘以后再对二者进行自
增运算。

[解决办法]
“序列点”是指当执行流到此处的时候,所有的表达式求值副作用均已完成(比如自增、自减)。
[解决办法]
我觉得也是47,在当前行i始终是7
下一行的时候才是9
不过我觉得不应该写出这种代码
[解决办法]
你别写这种代码就是了
它这里是先i*i了,再i自增两次.
[解决办法]
注意,是表达式“求值”而不是表达式“计算”,所以就算不写算术表达式,也有可能会遇上副作用问题。比如函数参数求值过程。
[解决办法]
这个在很多书上都有说明了,这和具体的编译器实现有关系的,所以建议lz不要写出这样容易混淆的代码。
如果非要解释的话,只能说在你这是:先取出i,即i = 7;然后执行 i * i = 49;最后让i++两次,即i = 9;
[解决办法]
这样的代码,执行结果将依赖于环境 ...
[解决办法]
规范代码吧
这个讨论一下就好
[解决办法]
不知道C中应该是怎样的行为了.但是,在C++中,标准明确了:
undefined behaviour

热点排行