#c #arrays #add
#c #массивы #Добавить
Вопрос:
Я пытался добавить первые 4 числа моего массива. Когда я тестирую это, я всегда получаю число «4201077», даже если первые цифры 4 — это 1, 2, 3 и 4. Когда я пытаюсь начать с разных чисел, я получаю немного другой вариант, такой как «4201092». Что я делаю не так? код:
int main(){
int a [10];
int count;
for (int i = 0; i < 10; i )
cin >> a[i];
int i = 0;
while ( i < 4){
count = a[i];
i ;
}
cout << count;
}
Комментарии:
1. Если вы компилируете с включенными предупреждениями, компилятор, скорее всего, сообщит вам о подобных проблемах. Например,
g -Wall
илиclang -Wall
.2. Ваш компилятор должен был предупредить вас
3. Вот один из способов, которым вы могли бы избежать инициализации count:
#include <numeric> ... int count; ... count = std::accumulate(a, a 4, 0);
Ответ №1:
Вы никогда не инициализируете count
для хранения какого-либо значения. Строка count = a[i];
считывается из count
, чтобы добавить a[i]
к этому значению. В C чтение из неинициализированной переменной в большинстве случаев является неопределенным поведением, включая этот. Следовательно, ваша программа может делать вообще что угодно, включая (но не ограничиваясь этим) печать неправильного результата, сбой или вообще ничего не делать.
// You have:
int count;
// Replace with:
int count = 0;
Всегда включайте все предупреждения компилятора и исправляйте любые, которые появляются. Каждый широко используемый компилятор помечает строку count = a[i];
предупреждением о чтении из неинициализированной переменной. Например, gcc говорит следующее:
main.cpp: In function 'int main()':
main.cpp:14:14: warning: 'count' is used uninitialized in this function [-Wuninitialized]
14 | count = a[i];
| ~~~~~~^~~~~~~
Комментарии:
1. «Поскольку количество подписано, чтение его значения является технически неопределенным поведением». Я почти уверен, что ошибка произошла бы, даже если бы она была без знака?
2. @Borgleader уже исправлено. Для этого словоблудия была причина, но это неважно.
3. » чтение из неинициализированной переменной в большинстве случаев является неопределенным поведением » — У вас есть пример, где это не так?
4. @Kevin Например, если тип имеет беззнаковый узкий символьный тип. В этом случае значение просто не указано, но нет UB.
5. @Kevin Это прямо в правиле, которое гласит, что это UB в первую очередь. Правило продолжает что-то вроде «не определено, за исключением …», а затем перечисляет случаи, когда это не UB.
Ответ №2:
Чтение неинициализированных переменных — это UB :https://en.cppreference.com/w/cpp/language/ub — что вы делаете с count = a[i];
, когда вы никогда не инициализировали count
.