相关疑难解决方法(0)

优化"while(1);" 在C++ 0x中

更新,见下文!

我听说并读过C++ 0x允许编译器为以下代码段打印"Hello"

#include <iostream>

int main() {
  while(1) 
    ;
  std::cout << "Hello" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它显然与线程和优化功能有关.在我看来,这可能让许多人感到惊讶.

有人能够很好地解释为什么必须允许这样做吗?作为参考,最新的C++ 0x草案说明了6.5/5

在for语句的情况下,在for-init语句之外的循环,

  • 不调用库I/O函数,和
  • 不访问或修改易失性对象,以及
  • 不执行同步操作(1.10)或原子操作(第29条)

可以通过实现来假设终止.[注意:这是为了允许编译器转换,例如删除空循环,即使无法证明终止也是如此. - 结束说明]

编辑:

这篇富有洞察力的文章谈到了标准文本

不幸的是,没有使用"未定义的行为".但是,只要标准说"编译器可以假设P",就暗示具有非-P属性的程序具有未定义的语义.

这是正确的,是否允许编译器为上述程序打印"Bye"?


这里有一个更有见地的线索,这是关于C的类似改变,由Guy完成上述链接文章开始.在其他有用的事实中,他们提出了一个似乎也适用于C++ 0x的解决方案(更新:这将不再适用于n3225 - 见下文!)

endless:
  goto endless;
Run Code Online (Sandbox Code Playgroud)

看来,编译器不允许优化它,因为它不是循环,而是跳转.另一个人总结了C++ 0x和C201X的建议更改

通过编写一个循环,程序员断言或者环路不可见的东西的行为(执行I/O,访问volatile对象,或执行同步或原子操作), 或者,它最终会终止.如果我通过编写一个没有副作用的无限循环来违反这个假设,我对编译器撒谎,而我的程序的行为是未定义的.(如果我很幸运,编译器可能会警告我.)语言不提供(不再提供?)表达无可见行为的无限循环的方法.


2011年3月3日更新为n3225:委员会将案文移至1.10/24并说

实现可以假定任何线程最终将执行以下操作之一:

  • 终止,
  • 调用库I/O函数,
  • 访问或修改易失性对象,或
  • 执行同步操作或原子操作.

goto把戏,工作了!

c++ optimization loops c++11

150
推荐指数
5
解决办法
1万
查看次数

如果它调用共享库,C++中的无限循环仍然是未定义的行为吗?

据说无限循环for(;;);是未定义的行为.


来自http://en.cppreference.com/w/cpp/language/memory_model

在有效的C++程序中,每个线程最终都会执行以下操作之一:

  • 终止
  • 调用I/O库函数
  • 读取或修改易失性对象
  • 执行原子操作或同步操作

没有执行任何这些可观察的行为,任何执行线程都不能永远执行.

请注意,这意味着具有无限递归或无限循环的程序(无论是作为for语句实现还是通过循环goto或其他方式)具有未定义的行为.


但是如果它在共享库中调用函数呢?

for(;;) sofunc();

该函数可以执行任何类型的阻塞I/O或抛出异常.

在这种情况下,编译器是否假定循环具有一些可观察的行为?

c++ infinite-loop undefined-behavior

12
推荐指数
1
解决办法
1673
查看次数

奇怪的情况 - 要求输入100位数字

我需要制作一个可以输入最多100位数字的程序.没有标准的int数据类型就能做到这一点!我从未遇到过这种奇怪的情况.

我根本得不到它.我该怎么解决这个问题?

我正在研究的问题是:

将给出一个整数,并且您必须创建一个程序来确定它是偶数还是奇数.

输入规格

在第一行中,将有一个整数T表示测试用例的数量.在以下T行中,将给出非负整数.该号码最多可以包含100位数字.

输出规格

对于给定的每个整数,您将必须打印它是奇数还是作为输出.

任何人都可以指导我如何解决问题(如果甚至可以这样做)?

c

-5
推荐指数
1
解决办法
1894
查看次数

标签 统计

c++ ×2

c ×1

c++11 ×1

infinite-loop ×1

loops ×1

optimization ×1

undefined-behavior ×1