C+中的序列点+;和例外情况 在C++中,编译器可以重新设置变量设置和或者,标准C++ 1488—1998允许或禁止编译器的转换?< /P>
代码:C+中的序列点+;和例外情况 在C++中,编译器可以重新设置变量设置和或者,标准C++ 1488—1998允许或禁止编译器的转换?< /P>,c++,standards-compliance,sequence-points,C++,Standards Compliance,Sequence Points,代码: bool funct() { bool succeeded = false; bool res_throw = false; try { throw("it"); succeeded = true; } catch(...) { res_throw = true; } cout << "Result of
bool funct()
{
bool succeeded = false;
bool res_throw = false;
try {
throw("it");
succeeded = true;
}
catch(...) {
res_throw = true;
}
cout << "Result of throw: " << res_throw << endl;
cout << "succeeded: " << succeeded << endl;
return succeeded;
}
标准上说:“[intro.execution]#7”:
正在修改对象。。他们都站在一边
影响,即
执行环境的状态
在被称为序列点的执行序列中的某些指定点,先前评估的所有副作用应完整,且后续评估的副作用不得发生
throw
语句是序列点吗?分号是序列点。在successed
设置为true
编辑:为了澄清:
成功
不会设置为真
是,有一个序列点与抛出
语句关联,因为每个语句的末尾都有一个序列点
因此,在您的示例中,successed
必须保持false
我没有C++98标准,但在C++03标准中:
1.9p16:每个完整表达式的完成处都有一个序列点
语句是最简单的一种“完整表达式”,但该标准的措词包括了技术上不属于任何语句的其他表达式。“分号是一个序列点”-请帮助我在标准14882(页码或节号或节名)@osgx:“完整表达式求值结束时找到它(§1.9/16)(完整表达式是不是另一个表达式的子表达式的表达式。)“另请参见:确切的短语是“16在每个完整表达式的计算完成时有一个序列点10”。@osgx:是。问题是什么?那么,每个
语句后面的代码>是一个seq。指向即使是跳转语句
?也很好。从技术上讲,并不是每一句话都是完整的表达<代码>中断代码>,继续代码>,返回代码>,转到标签代码>,以及一些声明,如intx代码>不包含或隐式使用任何语法表达式。在我的例子中,Throw
被定义为5.17[expr.ass]“赋值表达式:Throw表达式”&15[except]“Throw表达式:Throw
assignment-expression\u opt”中的表达式,使用GCC4.0或icc使用“gcc-O2-S”编译此表达式。这两种方法都将先存储到就绪状态,因此它可以与i/10的计算重叠。重新排序不是编译器错误。它是一个积极的优化器,正在完成它的工作。@osgx:引用的那篇文章是不同的。在这种情况下,优化器可以根据标准第1.9节的“仿佛”规则对语句重新排序。在您的示例中,程序测试值是否更改,因此它必须是正确的。在引用的示例中,当语句被重新排序时,程序本身无法采取不同的操作,因此优化器可以做它想做的事情。(多线程程序超出了C++98和C++03的范围,但是C++0x标准草案允许多线程程序,并且依赖于另一个线程的任何结果通常未指定。)
Result of throw: true
succeeded: true