Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Что даёт инициализация массива одним элементом?

#cpp #массивы #инициализация


Был приведен пример из учебника.

Задача: К строка студентам обратились с просьбой оценить качество пищи в студенческом
кафетерии по 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, ...}, таким образом первые элементы принимают значения, указанные в {} (списке инициализации), а остальные элементы инициализируются значением по-умолчанию (нулем). Для обнуления всего массива достаточно написать = {};

Комментариев нет:

Отправить комментарий