C++ Visual Studio 2012 Express 命令 window 奇怪的行为

C++ Visual Studio 2012 Express Command window weird behavior

 #include <iostream>
 #include <cmath>
 using namespace std;
 int main()
 {
    int riceamount=2, 
     squarenumber=1,
    totalamount=0,
  neededrice1000=0,
  neededrice1000000=0,
  neededrice1000000000=0;
   cout<<"Amount of rice you need for the square "<< 
   squarenumber<<" is " <<riceamount-1<<endl;

 cout<<"Amount of rice you need for the square "<< 
squarenumber+1<<" is " <<riceamount<<endl;
  squarenumber=2;

 for(int i=2;i<65;i++)

 {

        riceamount=riceamount*2;
        ++squarenumber;
        cout<<"Amount of rice you need for the square "<< squarenumber<<" is " <<riceamount<<endl;
        totalamount=totalamount+ riceamount;
        if (totalamount>1000)
            squarenumber=neededrice1000;
        if (totalamount>10000000 && totalamount<1100000)
            squarenumber=neededrice1000000;
        if (totalamount>1000000000 && totalamount<1100000000)
            squarenumber=neededrice1000000000;
    }  

system("pause");
return 0;}

当我调试命令 window 时奇怪地打印数字(在 10 之后它奇怪地变回 1 并继续打印 1 作为平方数然后当 c++ 放弃计算能力时从 2 继续),如下所示从图像,为什么?谢谢你的帮助。 Command window picture

最终 riceamount * 2 溢出 int 类型。

这样做的行为是未定义,但在您的情况下,计算实际上是对 2 的幂取模,对于 2 的大幂为零。

一个unsigned long long就足够分布在第一个方格上的64个方格中的米粒总数。

after 10 it weirdly turn back to 1 and keep going printing 1 as squarenumber

你告诉它:

if (totalamount>1000)
    squarenumber=neededrice1000;

这与Visual Studio命令无关window;这是您程序的既定逻辑。

我建议您使用铅笔和纸逐行浏览,以便理解您所写的内容。


when c++ gave up calculating powers

没有"give up";你的 int 溢出了巨大的数字,所以你的程序有 未定义的行为

对你来说,这导致了低值,低到以前的 pointed-out 错误不再出现,并且 squarenumber 再次可以在每次迭代中自由增加。

在此示例中,64 位类型就足够了(因此请考虑 uint64_t)。