Непредвиденная ошибка с условным оператором

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

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;

person nikel    schedule 22.11.2011    source источник
comment
Это работает? (a>b) ? (c = 30) : (c = 40);   -  person felipemaia    schedule 22.11.2011


Ответы (3)


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

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

(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.

person Joey Adams    schedule 22.11.2011

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

int d = a > b ? (c = 30) : (c = 40); // explicit precedence
person user7116    schedule 22.11.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» части тернарного оператора в последнем примере.

person Dmitri    schedule 22.11.2011