Почему не длинная int на 100% точна?

Я пробовал команду time -p в Linux и написал некоторый код, чтобы тратить циклы ЦП:

#include <iostream>

using namespace std;

int main() {
long int c;

long int ss;

for(c = 0;c < 10000000;c++) {
ss += c*c;
}

cout<<ss<<endl;

return 0;
}

Однако я заметил кое-что забавное после нескольких попыток:

me@octopus:~/Desktop> ./test
1292030741067648912
me@octopus:~/Desktop> ./test
1292030742538841328
me@octopus:~/Desktop> ./test
1292030742228685600
me@octopus:~/Desktop> ./test
1292030740402651312
me@octopus:~/Desktop> ./test
1292030740207543344
me@octopus:~/Desktop> ./test
1292030740346553856
me@octopus:~/Desktop> ./test
1292030741629275040
me@octopus:~/Desktop> ./test
1292030740397307072
me@octopus:~/Desktop> ./test
1292030742928964784
me@octopus:~/Desktop> ./test
1292030741780094096

Я не только не получал одно и то же число каждый раз, как я ожидал, я не получал одно и то же число ни разу. Что здесь происходит?

0

Решение

Вы не инициализировали ss нулем, поэтому его начальное значение не определено. Тебе нужно:

long int ss = 0;
10

Другие решения

Вы не инициализированы ss, Начальное значение может быть любым.

long int ss = 0;
5

Вы должны инициализировать ssВ противном случае вы получите непредсказуемые результаты.

long int ss = 0;

Неинициализированные переменные имеют неопределенное значение в C и C ++, в отличие от некоторых других языков программирования, таких как Java и C #, которые получают правильные значения по умолчанию в соответствии с типом. Поэтому обратите внимание на это для C / C ++.

3

ss += c*c;

всегда отличается, потому что в вашей первой итерации цикла ss всегда случайный.

Вы должны инициализировать его сначала до 0, чтобы работать, как вы ожидали.

2

Интересно услышать, что говорит компилятор:

#include <cstdio>

int main() {
long int ss;

for(long int c = 0; c < 10000000; c++) {
ss += c*c;
}

printf("%ld", ss);

return 0;
}

(Я использую C IO, потому что он производит меньше мусора в IR, но поведение схоже с потоками)

Происходит следующий LLVM IR (с включенной оптимизацией):

define i32 @main() nounwind uwtable {
%1 = tail call i32 (i8*, ...)* @printf(c"%ld\00", i64 undef)
ret i32 0
}

Я верю undef говорит сам за себя.

1
По вопросам рекламы [email protected]