Как запустить бесконечный l oop, который дает правильный результат? C ++ - PullRequest
0 голосов
/ 11 марта 2020

Я хочу запустить бесконечное l oop, которое печатает степень целого числа 2, а именно 2,4,8,16. Я написал этот код, но он не работает правильно в al oop, он дает 0 в качестве ответа. Тем не менее, он прекрасно работает без l oop означает, что он дает один ответ.

#include <iostream>
using namespace std;

int main()
{
    int n=2,power=1,i=1;
    while(i>0)
    {
    power*=n;
    cout<<power;
    }
    return 0;
}

Ответы [ 2 ]

4 голосов
/ 11 марта 2020

Ваша программа не просто выводит нули, когда я ее запускаю. Некоторое время он выводит степени двух, прежде чем из-за переполнения он начнет выводить нули.

Сначала добавьте разрывы строк, чтобы вам было легче определить, что происходит:

cout << power << endl;

Затем попробуйте передать вывод вашей программы в less или head -n40, чтобы вы могли увидеть начало ее вывода:

$ ./test | head -n40
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
0
0
0
0
0
0
2 голосов
/ 11 марта 2020

Проблема в том, что ваш l oop переполнит максимальное значение int при многократном умножении на n, что приводит к неопределенному поведению. Вы должны проверить свой l oop, чтобы избежать переполнения:

#include <iostream>
#include <limits>

int main()
{
    int n=2,power=1;
    while(power <= std::numeric_limits<int>::max()/n)
    {
        power *= n;
        std::cout << power << ' ';
    }
    std::cout << std::endl;
    return 0;
}
...