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