2014-04-27 4 views
2

Я новичок в C++, поэтому мне нужна ваша помощь. Я написал эту программу,Проблема с массивом C++

#include<iostream.h> 

int main(){ 
    int totalAge = 0; 
    int age[10]; 

    for(int j= 1; j<10; j++){ 
       age[j] = j; 
      cout << age[j] << endl; 
    } 

    for(int i = 0; i<10; i++){ 
      totalAge = age[i]; 
      cout << "Total Age is : " << totalAge << endl;   
    } 
    system("pause"); 
} 

Где, как выход в командной строке заключается в следующем:

Итого Эйдж: 1700868285

Всего возрастов: 1

Всего возрастов: 2

Итого Эйдж: 3

Итого Эйдж: 4

Итого Эйдж: 5

Итого Эйдж: 6

Итого Эйдж: 7

Итого Эйдж : 8

Общая возрастность: 9

Нажмите любую клавишу, чтобы продолжить. , ,

Единственное, что я хочу знать, что почему первый «Total Эйдж: 1700868285» Я считаю, что это должно быть «Total Эйдж: 0» Пожалуйста, объясните это. Спасибо

+0

'iostream.h' не является стандартным заголовком. Используйте 'iostream'. – chris

+0

Используйте std :: array. Это не решит вашу проблему, но вы должны начать использовать ее. Кроме того, это C++. Не нужно помечать C. – Ben

+1

спасибо дорогим братьям charis & Ben за предложение и исправление. – Shujaat

ответ

5

Ваш первый цикл никогда не инициализирован age[0]. В некоторых языках переменные автоматически устанавливаются по умолчанию. C++ не является одним из них. C++ не дает никаких гарантий относительно значения неинициализированной переменной. Значение 1700868285 - это просто то, что случилось в памяти, используемой для хранения age[0], когда интерпретируется как int.

Ваш код должен читаться следующим образом. Теперь age[0] установлен в 0.

for(int j = 0; j < 10; j++) 
{ 
    age[j] = j; 
    cout << age[j] << endl; 
} 

Это хороший пример того, почему вы должны проявлять большую осторожность при инициализации переменных в C++. Как указано ниже, @Caesar вы можете начать с объявления массива и инициализации его одновременно. Это добавляет небольшие накладные расходы тем, что вы написали нули в массиве, а затем обновите его с помощью значений, которые вы действительно хотите, но это поможет избежать проблемы, которая вас поймала.

Вы можете на самом деле сделать это, используя std::array (как указано @Ben) и std::iota из стандартной библиотеки, что упростит ваш код.

std::array<int, 10> age = { 0 };  // initialize all the values to zero. 
std::iota(begin(age), end(age), 0); // Set the values of the elements to 0...9 

Если вы хотите, чтобы сделать еще больше C++, как вы можете также рассмотреть вопрос об использовании новой формы for синтаксиса.

for (auto a : age) 
{ 
    totalAge = a; 
    cout << "Total Age is : " << totalAge << endl; 
} 

и рассмотреть возможность использования алгоритма std:accumulate, а не вручную вычисления суммы.

int totalAge = std::accumulate(begin(age), end(age), 0); 
+1

ok, спасибо за ответ , но теперь, если да, дайте мне знать, в первую очередь "Общая Возраст: 1700868285" Что такое "1700868285"? это адрес памяти? – Shujaat

+0

Я обновил свой ответ, см. Выше. –

+0

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

1

Вы никогда не инициализировать age[0], becuase j никогда не равен 0. Поэтому во втором цикле, когда i=0, totalAge присваивается неинициализированное значение age[0], которое содержит значение мусора.

+1

ok, спасибо за ответ , но теперь дайте мне знать, в первую очередь "Общая Возраст: 1700868285" Что такое "1700868285"? это адрес памяти? – Shujaat

+0

Это не имеет особого значения - это просто содержание этого адреса памяти. Вы будете получать разные цифры в разных ситуациях. – Benesh

+1

Спасибо, дорогой и сладкий милый @Benesh за помощь – Shujaat

3

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

Простое решение состоит в том, чтобы объявить ваш массив следующим образом: int age[10] = { 0 };, инициализируя все значения в массиве до нуля.

+0

Строго говоря, это означает, что вы дважды устанавливаете/инициализируете значения [1 ... 9] в возрасте. –

+0

@AdeMiller Правда, но этот небольшой удар производительности позволит вам избежать многих ошибок в будущем. Если в будущем вы обнаружите, что он занимает слишком много CPU, вы можете удалить его. – Caesar

0

Индексирование массива начинается с нуля. Если вы указали, что вы не указали значение для возраста [0], а во время вывода вы используете возраст [0], который дает значение мусора. Для этого выполните свой первый цикл от 0 до 9 .

0

в своем первом for цикле присвоить индекс массива к 1. индекс массива является первым, который не назначен ни к чему, что означает, что он может иметь любое значение (потому что это uninitilized) , Затем во втором цикле for вы получаете доступ к этому индексу, который имеет неинициализированное значение.

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

for(int j = 0; j < 10; j++){ 
    age[j] = j; 
    cout << age[j] << endl; 
} 

Обратите внимание, что единственное изменение в том, что теперь начинается с 0.

0

Ваш первый цикл начинается с

int j= 1; 

и первый элемент массива - возраст [0]. Во втором цикле вы пытаетесь получить значение age [0], и поскольку он никогда не был инициализирован, вы получаете этот длинный адрес адресата.

Смежные вопросы