Какова связь между запятой и круглыми скобками и фигурными скобками в C? - PullRequest
3 голосов
/ 09 июля 2019

У меня есть следующие две строки, и я не смог найти хорошего объяснения.

Я читал о двойственной природе запятой как оператора и разделителя, приоритете приоритета в скобках и запятой в качестве точки последовательности,

int a =(3,4) // here a is 4 because comma here is an operator first a=3 , then a = 4 
int a={3,4} // here is the problem , should not a=3 and then a =4 too because comma is a sequence point or it's undefined behavior or what ?

Я ожидал

a=4
a=4 , 
but the actual output is 
a=4 , a=3

1 Ответ

5 голосов
/ 09 июля 2019

В первом случае:

int a =(3,4);

Переменная инициализируется выражением, состоящим из оператора запятой и скобок.Это выражение оценивается как 4, как вы правильно догадались, и это то, что присваивается a.

Во втором случае:

int a={3,4};

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

Таким образом, a присваивается первое значение в списке инициализатора, а именно 3, и значение 4 отбрасывается.

Если бы вы сделали это:

int a[2] = {3, 4};

Тогда a[0] будет 3, а a[1] будет 4.

...