Подтвердить что ты не робот

Оператор запятой в c

#include<stdio.h> 
int main(void) {
   int a=(1, 2), 3; 
   printf("%d", a);
   return 0;
}

вывод: 2
Может ли кто-нибудь объяснить, как вывод 2?

4b9b3361

Ответ 1

Может ли кто-нибудь объяснить, как вывод 2?

В заявлении

a = (1, 2), 3;   

, используется оператор запятой. Из-за более высокого приоритета оператора =, чем оператора ,, операнд выражения (1, 2) будет привязан к = как

(a = (1, 2)), 3;  

В случае оператора запятой левый операнд оператора запятой вычисляется на выражение void, тогда правый операнд оценивается, а результат имеет значение и тип правильного операнда.

Здесь есть два оператора запятой. Для первого оператора запятой в выражении (1, 2), 1 будет вычисляться на void выражение, а затем 2 будет оценен и будет назначен a.
Теперь был выполнен побочный эффект a, и поэтому будет оценен правый операнд второго оператора запятой 3, а значение выражения (a = (1, 2)), 3 будет 3.

Ответ 2

Может ли кто-нибудь объяснить, как вывод 2?

Поскольку приоритет оператора присваивания (=) выше, чем оператор запятой (,).

Следовательно, утверждение:

a = (1, 2), 3;

эквивалентно:

(a = (1, 2)), 3;

и выражение (1, 2) оценивается как 2.

Ответ 3

результат:

a = x, y     =>     x

a = (i, j)   =>     j

поэтому, если мы имеем:

x = (1 , 2)

a = (1 , 2) , 3     =>     2

Как сказано здесь:

Оператор запятой разделяет выражения (которые имеют значение) таким образом аналогично тому, как точки с запятой завершают утверждения, и последовательности выражения заключены в круглые скобки аналогично тому, как последовательности операторов заключены в фигурные скобки: (a, b, c) - последовательность выражения, разделенные запятыми, которые оцениваются до последнего выражение c в то время как {a; б; c;} - последовательность операторов, и не оценивать какое-либо значение. Запятая может встречаться только между двумя выражения - запятые отдельные выражения - в отличие от точки с запятой, который встречается в конце (неблокированного) оператора - точки с запятой завершать утверждения.

Оператор запятой имеет наименьший приоритет любого оператора С и действует как точка последовательности. В комбинации запятых и точек с запятой, точки с запятой имеют более низкий приоритет, чем запятые, так как точки с запятой разделяются заявления, но запятые происходят в рамках утверждений, которые соответствуют их использование в качестве обычной пунктуации: a, b; c, d сгруппированы как (a, b); (c, d), поскольку это два отдельных оператора.

Надеюсь, это ответит на ваш вопрос.