У меня есть следующие две строки, и я не смог найти хорошего объяснения
Я читал о двойной природе запятой как оператора и разделителя, приоритете приоритета скобок и запятой как точки последовательности.
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,2}; своеобразный список инициализации
В первом случае:
int a =(3,4);
Переменная инициализируется выражением, состоящим из оператора-запятой и скобки. Это выражение оценивается как 4, как вы правильно предположили, что и присваивается a
.
Во втором случае:
int a = {3,4};
Переменная инициализируется с помощью список инициализаторов, что обозначают фигурные скобки, а запятая разделяет инициализаторы. Если бы рассматриваемая переменная была структурой или массивом, значения в списке инициализатора были бы присвоены каждому элементу. Если инициализаторов больше, чем элементов, лишние значения отбрасываются.
Итак, a
присваивается первое значение в списке инициализаторов, а именно 3, а значение 4 отбрасывается.
Если бы вы сделали это:
int a[2] = {3, 4};
Тогда a[0]
будет 3, а a[1]
будет 4.
Придирка: стандарт гласит: «Инициализатором для скаляра должен быть одно выражение, необязательно заключенный в фигурные скобки», где «выражение» должно интерпретироваться в свете формального синтаксиса как assignment-expression
, которое не может содержать оператор запятой на самом внешнем уровне. Таким образом, поведение инициализатора OP, заключенного в фигурные скобки, — неопределенный. Небезопасно предполагать, что лишний инициализатор внутри фигурных скобок будет просто отброшен. Фактически, в некоторых реализациях он может использоваться вместо первого, и, конечно же, может наблюдаться любое более дикое поведение.