троичный оператор и оператор присваивания

в Действительно ли троичный оператор 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.
Может кто-нибудь сказать мне, как именно операторы сгруппированы в этом случае.

2

Решение

Ваш связанный вопрос (Действительно ли троичный оператор C / C ++ имеет тот же приоритет, что и операторы присваивания?) ответ @hvd показывает ответ.

C ++ и C грамматики для ?: разные.

В C ++ самый правый операнд может быть выражением присваивания (поэтому компилятор [жадно] обрабатывает = являются частью ?:) в то время как в C самый правый операнд conditional-expression вместо. Таким образом, в C, как только компилятор нажмет = анализ ?: завершено, и это относится к нему как k = ( 21 > 3 ? 12 : j ) = 10,

2

Другие решения

k=21>3?12:(j=10) оценивается как

if ( 21 > 3 )
k = 12;
else
k = ( j = 10 );

поскольку 21>3 является trueусловие else не оценивается и j имеет неопределенное значение (или любое другое значение, которое было до этого оператора).

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector