关于C++中Infinte Loop的问题

Lub*_*los 2 c++ infinite-loop

这是一种好奇心.

我正在学习C++.我被要求重现一个无限循环,例如一个打印一系列权力的循环:

#include <iostream>

int main()
{
    int powerOfTwo = 1; 

    while (true)
    {
        powerOfTwo *= 2;
        cout << powerOfTwo << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果有点困扰我.例如,使用Python解释器,我曾经得到一个有效的无限循环,每次迭代时都会打印2的幂(当然,直到IDE停止超过迭代的限制).使用这个C++程序,我得到一系列0.但是,如果我将其更改为有限循环,也就是说我只将条件语句更改为:

(powerOfTwo <= 100)
Run Code Online (Sandbox Code Playgroud)

代码运行良好,打印2,4,16,...,128.

所以我的问题是:为什么C++中的无限循环以这种方式工作?为什么它似乎根本不评估同时的身体?

编辑:我正在使用Code :: Blocks并使用g ++进行编译.

tot*_*two 7

在无限循环的情况下,您会看到0,因为int在32次迭代后溢出为0且0*2 == 0.

看看前几行输出.http://ideone.com/zESrn 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 268435456 536870912 1073741824 -2147483648 0 0 0


Chr*_*Vig 6

在Python中,整数可以包含任意数量的数字.C++不能以这种方式工作,它的整数只有有限的精度(通常是32位,但这取决于平台).乘以2是通过向左逐位移位一位整数来实现的.发生的事情是你最初只有整数集中的第一位:

powerOfTwo = 1; // 0x00000001 = 0b00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)

在循环迭代31次之后,该位将移位到整数中的最后一个位置.

powerOfTwo = -2147483648; // 0x80000000 = 0b10000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

下一个乘以2,该位一直移出整数(因为它具有有限的精度),并且最终为零.

powerOfTwo = 0; // 0x00000000 = = 0b00000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

从那时起,你就会陷入困境,因为0*2总是为0.如果你以"慢动作"观看你的程序,你会看到最初的2次爆发,然后是无限循环的零.

另一方面,在Python中,您的代码将按预期工作 - Python整数可以扩展为保持任意数量的数字,因此您的单个位将永远不会"移出整数"的末尾.这个数字将继续扩大,以便钻头永远不会丢失,你将永远不会回绕并陷入零.