Тернарный и запятый оператор

int a,b;
a = 1 ? 1,2 : 3,4; // a = 2
b = 0 ? 1,2 : 3,4; // b = 3

Оператор запятой всегда возвращает правую часть запятой, но если мы присваиваем переменную, он возвращает влево, кроме случая, когда мы используем (). Так как, черт возьми, первое выражение дает 2.

Я вижу это как a = 1,2, так что это должно быть 1, но на самом деле a=2.

Зачем?

1 ответ

Решение

Из-за приоритета оператора (оператор запятой имеет наименьший приоритет), ваш код на самом деле выглядит

int a,b;
(a = 1 ? (1,2) : 3),4; // a = 2
(b = 0 ? (1,2) : 3),4; // b = 3

Итак, согласно правилу троичного условия, цитирование C11Глава §6.5.15

Первый операнд оценивается; между оценкой и оценкой второго или третьего операнда существует точка последовательности (в зависимости от того, что оценивается). Второй операнд оценивается, только если первый сравнивается с неравным 0; третий операнд оценивается, только если первый сравнивается равным 0; Результатом является значение второго или третьего операнда (в зависимости от того, что оценивается), преобразованное в тип, описанный ниже. 110)

[...]

110) Условное выражение не дает lvalue.

  • Для первого случая второй операнд вычисляется и возвращается.
  • Во втором случае третий операнд вычисляется и возвращается.
Другие вопросы по тегам