C ++ Visual Studio 2012 Express командное окно странное поведение - PullRequest
0 голосов
/ 25 июня 2019
 #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;}

Когда я отлаживаю командное окно, странным образом печатаю числа (после 10 оно странным образом возвращается к 1 и продолжает печатать 1 как квадратное число, а затем продолжает с 2, когда c ++ отказался от вычислительных мощностей), как вы можете видеть ниже из изображения,Зачем?Спасибо за любую помощь. Изображение окна команды

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

после 10 странно возвращается в 1 и продолжает печатать 1 как квадратное число

Вы сказали это:

if (totalamount>1000)
    squarenumber=neededrice1000;

Это не имеет ничего общего с окном команд Visual Studio; это заявленная логика вашей программы.

Я предлагаю вам шаг за шагом пройти по нему карандашом и бумагой, чтобы понять, что вы написали.


когда c ++ отказался от вычислительных мощностей

Он не "сдался"; вы переполнили int огромными числами, поэтому ваша программа имеет неопределенное поведение .

Для вас это привело к низким значениям, достаточно низким, чтобы ранее указанная ошибка больше не появлялась, и squarenumber снова можно увеличивать на каждой итерации.

В этом примере достаточно 64-битного типа (поэтому рассмотрим uint64_t).

0 голосов
/ 25 июня 2019

В конце концов riceamount * 2 переполняется тип int.

Поведение при этом равно undefined , но в вашем случае вычисление эффективно по модулю степени 2, которая равна нулю для большой степени 2.

Значение unsigned long long будет достаточно большим для общего числа зерен риса, распределенных по 64 клеткам с 1 зерном на первом квадрате.

...