Неожиданная ошибка с условным оператором - PullRequest
1 голос
/ 22 ноября 2011

Код ниже компилируется хорошо

int a=5,b=4,c;
a>b?30:40;

Также делает,

int a=5,b=4,c;
a>b?c=30:40;

Но почему это не работает?

int a=5,b=4,c;
a>b?c=30:c=40;

Ответы [ 3 ]

7 голосов
/ 22 ноября 2011

Вас укушает приоритет.?: имеет очень низкий приоритет, но не такой низкий, как = или , (см. Таблицу приоритетов оператора ).

Ваш код анализируется как:

(a>b ? c=30 : c) = 40;

Вместо:

a>b ? c=30 : (c=40);

Вам не нужно ставить круглые скобки вокруг c=30, поскольку ? и : действуют как скобки для выражения внутри.


Хотите верьте, хотите нет, (a>b ? c=30 : c) = 40 является допустимым C ++ (но не действительным C).Выражение (a>b ? c=30 : c) является lvalue , ссылающимся на переменную c, которой назначено 40.

1 голос
/ 22 ноября 2011

Вы столкнулись с проблемой приоритета с оператором =.Если вы настаиваете на присваивании внутри вашего троичного оператора, просто заключите подвыражения в круглые скобки:

int d = a > b ? (c = 30) : (c = 40); // explicit precedence
0 голосов
/ 22 ноября 2011

Последний:

int a=5,b=4,c;
a>b?c=30:c=40;

не удается, потому что он пытается присвоить 40 a>b?c=30:c, что, очевидно, не будет работать. = имеет более низкий приоритет, а a>b?c=30:c является допустимым выражением (хотя вы не можете его назначить). = в части c=30 является своего рода исключением, потому что он находится в середине троичного оператора, между ? и :. Чтобы исправить это, вам просто нужно добавить круглые скобки вокруг c=40, чтобы он оценивался как одно значение для части else в троичном операторе, то есть a>b?c=30:(c=40);

Второй пример

a>b?c=30:40;

ничего не присваивает c, если a не больше, чем b ... что это когда a равно 5 и b равно 4, как в этом случае; но учтите, что если бы a не было больше b, никакого присвоения не произошло бы.

Из первого примера

a>b?30:40

является допустимым выражением со значением 30 или 40, но вы ничего не делаете с этим значением, поэтому, конечно, оно бесполезно.

Конечно, вы обычно используете что-то вроде:

c = a>b ? 30 : 40;

, где a>b ? 30 : 40 будет иметь значение 30 или 40, которое затем присваивается c. Но я подозреваю, что вы это знаете и просто хотите знать, почему c=40 не рассматривается как одно значение для части else в троичном операторе в последнем примере.

...