所以我今天在C ++测试中有了这段代码:
for(int i=10;i++;i<15){cout<<i;}
这应该输出什么?为什么?
谢谢!
答案 0 :(得分:1)
for
循环将一直运行,直到:
第二个参数的评估结果为0 / false。
循环体调用break
或return
,或抛出异常,或以其他方式退出调用线程。
您显示的代码可能会或可能不会无限循环 。但是,它不会循环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
)。继续循环体,在每次迭代中执行i
和15
的比较(只是比较,不检查结果,这是你的增量表达式),递增i
并检查它是否为非-0。
由于编译器理解有符号整数从不溢出,因此{10}从10开始时永远不会变为0.因此,优化编译器将完全取消检查,并将其转换为无限循环。
最后,但并非最不重要,学会喜欢编译器警告。特别是,此代码产生以下内容:
i++