程序终止C ++程序是否可观察到行为?

时间:2010-11-18 10:06:49

标签: c++ c++11

我本可以将其称为什么构成可观察的行为?

C ++标准谈论了很多关于可观察行为的内容,但我不确定程序终止是否是可观察行为的一部分。

即,给出如下程序:

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

是否允许终止此程序?

2 个答案:

答案 0 :(得分:6)

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

C ++ 0x FCD说6.5说(特别注意 note ):

  

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

     

可以由实现假定终止。 [注意:这是为了允许编译器转换,例如删除空循环,即使无法证明终止也是如此。 - 结束记录]

因此,编译器可以假设您的for循环终止,并且由于正文为空,因此可以完全优化它。


草稿中的引文是从this question复制而来,并根据我的副本进行了验证。

答案 1 :(得分:2)

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

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

  • 0时没有错误
  • 不成功时不是0值

普通终端没有显示这种状态,这就是你没有“看到”它的原因。

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

程序无法退出,但根据不同的操作系统,它可以通过例如信号,中断来终止......

- 编辑 -

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

Martin和Motti在previous answer中解释道:

  

讨论基于允许   编译器可以优化   安全地执行。自从删除了   死循环是明确允许的   编译器可以免费上述垃圾   循环因此允许程序   终止