Последний:
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 в троичном операторе в последнем примере.