我正在完成一项家庭作业,我可能会对这件事感到有点过分,所以我只是在寻求一些意见。这是基本代码:
for(x = 100; x > 0; x = x + x) {
sum = sum + x;
有两个版本:一个x
是float
,另一个是int
。问题是这些无限循环。
我想当x
是int
时,它最终会溢出,使其小于零并且循环将停止。当x
为float
时,x
将达到无穷大,循环将是无限的。
我关闭了吗?
答案 0 :(得分:8)
未定义有符号整数增加超出其限制时的行为。所以循环可能结束或者可能是无限的。或者它可能会崩溃(或循环可能永远不会运行)。或者正如一些C大师所说,恶魔可能会飞出你的鼻子 - 虽然我个人怀疑任何编译器实现者都会遇到实施鼻子恶魔功能的麻烦。
就浮点值而言,你是正确的,它将是一个无限循环。
答案 1 :(得分:3)
当有符号整数溢出时,行为未定义。期待x
将变为负面是最好的天真。
某些编译器(如GCC)实际上实现了所谓的严格值语义,这意味着编译器利用该未定义的行为进行优化。在您的具体示例中,编译器可能会立即生成一个简单的无限循环,即根本没有任何终止条件的循环。
答案 2 :(得分:2)
你确实是正确的,整数会溢出到负值(只要它们已经签名)所以循环将结束,并且浮点数将保持“+无穷大”,它总是大于除{{1}之外的任何数字}。
编辑:我更正了,NaN
版 无限循环(由于他们的假设,在某些编译器上):http://ideone.com/HZkht