这是为了循环正确和无限,为什么?

时间:2018-03-22 20:03:15

标签: c++ for-loop

所以我今天在C ++测试中有了这段代码:

for(int i=10;i++;i<15){cout<<i;}

这应该输出什么?为什么?

谢谢!

3 个答案:

答案 0 :(得分:1)

for循环将一直运行,直到:

  • 第二个参数的评估结果为0 / false。

  • 循环体调用breakreturn,或抛出异常,或以其他方式退出调用线程。

您显示的代码可能会或可能不会无限循环 。但是,它不会循环5次,因为for语句的第2和第3个参数是相反的。

循环应该如下所示:

for(int i = 10; i < 15; i++)

然而,在您所显示的表格中:

for(int i = 10; i++; i < 15)

只要i不为0,循环就会继续运行。根据编译器如何将i++解释为循环条件,可能认识到这将导致溢出,只是决定忽略i并使循环无限期地运行,或者可能实际增加i并让溢出发生。

在后一种情况下,在每次循环迭代时,i将递增,最终i将溢出超过int可以容纳的最大值。那时,i 通常会回绕到负值,因为int是一个有符号的类型(虽然溢出行为不是由C ++标准正式定义的,所以包裹不保证)。然后循环将继续运行,因为i不为0,每次递增i,直到它最终达到0,从而打破循环。

在任何一种情况下,循环最终都会调用cout << i几千/百万次(取决于int的字节大小),或者永远调用它直到程序终止。

答案 1 :(得分:0)

  

这应该输出什么?为什么?

无条件地执行 signed int溢出。

所以它是未定义的行为,可以做任何事情。

答案 2 :(得分:0)

出于实际目的,使用任何现代编译器,此循环将永远持续。原因是代码在语法上是正确的(但在语义上非常不正确)。

for(int i = 10; i++; i < 15)

表示:从i开始等于10.检查i++是否为真(由于整数可转换为布尔值,非0值转换为true)。继续循环体,在每次迭代中执行i15的比较(只是比较,不检查结果,这是你的增量表达式),递增i并检查它是否为非-0。

由于编译器理解有符号整数从不溢出,因此{10}从10开始时永远不会变为0.因此,优化编译器将完全取消检查,并将其转换为无限循环。

最后,但并非最不重要,学会喜欢编译器警告。特别是,此代码产生以下内容:

i++