В C, что именно происходит, если я использую () для инициализации массива двойного измерения вместо {}?
Когда я инициализирую массив a[][]
:
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
а затем отобразить элементы массива.
Почему я получаю:
11 89 0 0 0
0 0 0 0 0
Что произойдет, если вы будете использовать фигурные скобки вместо первых скобок здесь?
4 ответа
(8,9,7,67,11)
является выражением, использующим оператор запятой, который оценивается как 11. То же самое верно для другого инициализатора. Таким образом, вы только инициализируете первые два элемента в явном виде, затем все остальные инициализируются равными 0. Ваш компилятор должен предупредить об отсутствии уровня фигурных скобок в инициализаторе.
Если вы используете фигурные скобки, вы инициализируете два компонента массива a
, как это, вероятно, предполагается.
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
эквивалентно (в области видимости блока):
int a[2][5]={11, 89};
,
является оператором C запятой. Он оценивает свои операнды слева направо и выдает значение правого операнда.
В области видимости файла массив инициализаторов должен быть постоянным и как ,
выражение никогда не является константным выражением, объявление массива недопустимо.
Потому что вы используете не скобки, а скобки. Ты хочешь:
int a[2][5] = { { 8,9,7,67,11 }, { 7,8,9,199,89 } };
// ^^^ ^^^^^^ ^^^
В своем исходном коде вы только что познакомились с оператором запятой, и вы на самом деле написали int a[2][5] = { 11, 89 };
, Это допустимо, но инициализирует все недостающие элементы в ноль.
Это концепция comma operator
а также comma separator
Вы должны использовать {}
инициализировать массив
int a[2][5]={(8,9,7,67,11),(7,8,9,199,89)};
Вот (8,9,7,67,11)
эквивалентно 11
потому что comma operator
а также (7,8,9,199,89)
эквивалентно 89
для того же, потому что оператор запятой оценивается как left to right
и самое правое значение является возвращаемым значением
следовательно, это эквивалентно a[2][5]={11,89}
но (8,9,7,67,11),(7,8,9,199,89)
но запятая используется в () , ()
является comma separator