代码之家  ›  专栏  ›  技术社区  ›  Martin Ba

程序终止是C++程序可观察的行为吗?

  •  13
  • Martin Ba  · 技术社区  · 14 年前

    我也可以这样说 什么构成可观察的行为?

    C++标准讨论了很多可观察的行为,但我不太清楚程序终止是否是可观察行为的一部分。

    也就是说,给定一个程序,例如:

    int main() {
      for(;;) {}
      return 0;
    }
    

    是否允许一致性实现终止此程序?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Community CDub    8 年前

    是的,编译为上述代码生成一个空的主体是合法的(因此几乎立即终止)。

    C++0X FCD说6.5(特别注意) 笔记 ):

    在for语句的情况下,在for init语句之外,
    *不调用库I/O函数,并且
    *不访问或修改易失性对象,以及
    *不执行同步操作(1.10)或原子操作(第29条)

    可能被实现假设为终止。 [ 注: 这是为了允许编译器转换,例如删除空循环,即使终止不能被证明。 –尾注 ]

    所以编译器可以假设 for 终止,因为主体是空的,所以它可以完全优化它。


    草案中的引文是从 this question 并核实了我的副本。

        2
  •  2
  •   Community CDub    8 年前

    程序终止是C++程序可观察的行为吗?

    是的,完成程序的执行是一种可观察的行为,因为程序返回错误代码。

    • 无错误时为0
    • 不成功时不是0值

    正常终端不显示这种状态,这就是为什么你不“看到”它。

    是否允许一致性实现终止此程序?

    程序不能退出,但取决于不同的操作系统,它可以被终止,例如信号,中断…

    --编辑--

    第二个问题的答案有点错误

    正如马丁和莫蒂在 previous answer :

    讨论是基于允许的 编译器可以进行的优化 安全执行。自从 显式允许死循环 编译器可以随意丢弃上面的内容 从而允许程序 终止