Тернарный и запятый оператор
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.
- Для первого случая второй операнд вычисляется и возвращается.
- Во втором случае третий операнд вычисляется и возвращается.