Код ниже компилируется хорошо
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;
Код ниже компилируется хорошо
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;
Вас кусают по старшинству. ?:
имеет очень низкий приоритет, но не такой низкий, как =
или ,
(см. таблицу приоритетов операторов).
Ваш код анализируется как:
(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
.
Вы столкнулись с проблемой приоритета с оператором =
. Если вы настаиваете на присваивании внутри тернарного оператора, просто заключите подвыражения в круглые скобки:
int d = a > b ? (c = 30) : (c = 40); // explicit precedence
Последний:
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» части тернарного оператора в последнем примере.
(a>b) ? (c = 30) : (c = 40);
- person felipemaia   schedule 22.11.2011