Почему вы не можете сделать условное присвоение в кратком заявлении IF? - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь обновить softcount для моей игры в Блэкджек, чтобы учесть тузы в игре (значение 11 или 1). Почему при использовании оператора IF в краткой форме неверна первая строка кода, а вторую можно использовать? Этот тип оператора if ограничен?

(counter > 1) ? (softcount+=1) : (softcount+=value); // bad


softcount += (counter > 1) ? 1 : value; // good

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Это просто, как определяется язык.

Только определенные выражения - выражения операторов - могут быть преобразованы в оператор путем добавления ;. (Выражение оператора + ; является оператором выражения ).

С JLS Sec 14,8 :

ExpressionStatement:
  StatementExpression ;

StatementExpression:
  Assignment 
  PreIncrementExpression 
  PreDecrementExpression 
  PostIncrementExpression 
  PostDecrementExpression 
  MethodInvocation 
  ClassInstanceCreationExpression

Условные выражения не являются выражениями операторов.

1 голос
/ 26 апреля 2019

Троица должна рассматриваться как способ оценки чего-то, а не как способ применения обработки.
Таким образом, после ? ожидаются некоторые выражения, но вы написали операторы: softcount+=1 и (softcount+=value) впервый код.
Во втором коде все нормально, потому что вы указали два выражения: 1 и value.

Кроме того, ты действительно находишь этот код короткой рукой?

(counter > 1) ? (softcount+=1) : (softcount+=value); // bad

Вы повторяете инкрементную часть.

То, что вы хотите в вашем случае, это просто:

if (counter > 1) { softcount+=1;} else {softcount+=value;)
0 голосов
/ 26 апреля 2019

Он называется тернарным оператором, он используется, когда вы просто хотите вернуть значение на основе условия.Его главная цель состоит в том, чтобы избежать простых оценок.В вашем случае вы должны использовать, если еще.

...