в Действительно ли троичный оператор C / C ++ имеет тот же приоритет, что и операторы присваивания?
В ответе Лучиана Григоре говорится, что такие случаи, как
a ? b : c = d
всегда будет выводиться как
a ? b : ( c = d )
потому что оба = и?: ассоциировать справа налево так
в с ++
k = 21 > 3 ? j = 12 : j = 10;
а также
k = 1 > 3 ? j = 12 : j = 10;
оба в порядке.
В С
k = 21 > 3 ? 12 : j = 10
возвращает ошибку
invalid lvalue in assignment.
Не должно быть указано выше как (и не возвращает ошибку)
k= 21 > 3 ? 12 : ( j = 10 )
Я предполагаю, что теперь это сгруппировано как
k = ( 21 > 3 ? 12 : j ) = 10
что дает ошибку, поскольку в C (не в C ++) троичный оператор не может возвращать lvalue.
Может кто-нибудь сказать мне, как именно операторы сгруппированы в этом случае.
Ваш связанный вопрос (Действительно ли троичный оператор C / C ++ имеет тот же приоритет, что и операторы присваивания?) ответ @hvd показывает ответ.
C ++ и C грамматики для ?:
разные.
В C ++ самый правый операнд может быть выражением присваивания (поэтому компилятор [жадно] обрабатывает =
являются частью ?:
) в то время как в C самый правый операнд conditional-expression
вместо. Таким образом, в C, как только компилятор нажмет =
анализ ?:
завершено, и это относится к нему как k = ( 21 > 3 ? 12 : j ) = 10
,
k=21>3?12:(j=10)
оценивается как
if ( 21 > 3 )
k = 12;
else
k = ( j = 10 );
поскольку 21>3
является true
условие else не оценивается и j
имеет неопределенное значение (или любое другое значение, которое было до этого оператора).