Был приведен пример из учебника.
Задача: К строка студентам обратились с просьбой оценить качество пищи в студенческом
кафетерии по 10 шкале. Поместить 40 ответов в массив целых чисел и просуммируйте результаты
опросов.
int main()
{
setlocale(LC_ALL, "Russian");
const int respenseSize = 40, frequencySize = 11;
int responses[respenseSize] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6,
10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 };
int frequency[frequencySize] = { 0 };// ?
for (int answer = 0; answer < respenseSize; answer++)
++frequency[responses[answer]];
cout << "Рейтинг" << " " << "Частота" << endl;
for (int rating = 1; rating < frequencySize; rating++)
cout << " " << rating << " " << frequency[rating] << endl;
return 0;
}
Вопрос: int frequency[frequencySize] = { 0 }; мы обнулили первое начальное значение?для
того что бы на экране как мы запустили программу не было в столбике 0 0 или тут что
то более глубокое.Код весь ясен кроме этой части.Спасибо.
Ответы
Ответ 1
Имеется следующая цепочка из цитат из стандарта C++, которые объясняют, как инициализируются
элементы массива при инициализации массива вида
int frequency[frequencySize] = { 0 };
Первое, на что следует обратить внимание, это то, что массивы относятся к агрегатным
типам. Поэтому обращаемся в раздел, где описана инициализация агрегатных типов 8.5.1
Aggregates:
7 If there are fewer initializer-clauses in the list than there are
members in the aggregate, then each member not explicitly initialized
shall be initialized from its brace-or-equal-initializer or, if there
is no brace-or-equalinitializer, from an empty initializer list
(8.5.4).
Эта выдержка из стандарта говорит о том, что если инициализаторов меньше, чем элементов
в массиве, то элементы массива, которые не имеют явного инициализатора инициализируются
как будто бы указаны пустые фигурные скобки для каждого элемента. То есть это можно
представить следующим образом
int frequency[frequencySize] = { 0, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} };
Теперь обратимся к стандарту за разъяснением, что означает, когда имеется пустые
фигурные скобки. В параграфе №3 раздела 8.5.4 List-initialization, написано
— Otherwise, if the initializer list has no elements, the object is
value-initialized
А что означает value-initialized? Об этом написано в разделе 8.5 Initializers стандарта
8 To value-initialize an object of type T means:
— otherwise, the object is zero-initialized.
И, наконец, понятие zero-initialized означает (8.5 Initializers)
6 To zero-initialize an object or reference of type T means:
— if T is a scalar type (3.9), the object is initialized to the value obtained
by converting the integer literal 0 (zero) to T;
То есть все элементы массива, которым не были заданы явным образом инициализаторы,
инициализируются нулем. Поэтому в итоге данная запись
int frequency[frequencySize] = { 0 };
эквивалентна следующей записи:
int frequency[frequencySize] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
И, в итоге, получаем, что запись
int frequency[frequencySize] = { 0 };
эквивалентна записи
int frequency[frequencySize] = {};
Имейте в виду, что в языке C две последние записи не эквивалентны. Для языка C запись
int frequency[frequencySize] = {};
ошибочна, и компилятор выдаст сообщение об ошибке.
Ответ 2
int a[N] = {0}; инициализирует первый элемент нулем, и обнуляет все остальные элементы
массива.
Если написать = {1};, то в массиве будет {1, 0, 0, ...},
если написать = {1, 2}; то в массиве будет {1, 2, 0, ...},
таким образом первые элементы принимают значения, указанные в {} (списке инициализации),
а остальные элементы инициализируются значением по-умолчанию (нулем).
Для обнуления всего массива достаточно написать = {};