Использование условного оператора без назначения его результата - PullRequest
3 голосов
/ 15 января 2011

Почему я должен присвоить результат следующего условного выражения переменной, чтобы заставить его компилироваться?

piece.isWhite() ? whitePieceSquares.add(getSquare(pos)) : blackPieceSquares.add(getSquare(pos));

Выше не компилируется, ниже:

boolean garbage = piece.isWhite() ? whitePieceSquares.add(getSquare(pos)) : blackPieceSquares.add(getSquare(pos));

List#add() возвращает логическое значение, но я бы просто проигнорировал это. Просто условный оператор разработан таким образом, что необходимо присваивать значения, возвращаемые функциями, и эти возвращаемые функции должны иметь одинаковый тип?

Ответы [ 5 ]

5 голосов
/ 15 января 2011

С раздел 14.8 JLS (выражения выражения):

Определенные виды выражений можно использовать в качестве операторов, следуя за ними через точку с запятой:

ExpressionStatement:
      StatementExpression ;

StatementExpression:
       Assignment
       PreIncrementExpression
       PreDecrementExpression
       PostIncrementExpression
       PostDecrementExpression
       MethodInvocation
       ClassInstanceCreationExpression

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

В отличие от C и C ++, язык программирования Java допускает использование только определенных форм выражений в качестве операторов выражений.

...

С другой стороны, язык допускает все самые полезные виды выражений в выражениях выражений и не требует вызова метода, используемого в качестве выражения выражения для вызова метода void, поэтому такой прием почти никогда не требуется. Если нужен трюк, вместо него можно использовать оператор присваивания (§15.26) или оператор объявления локальной переменной (§14.4).

В принципе, основная цель условного оператора состоит в оценке его операндов - вы используете его для побочных эффектов.

Ответ Питера Лоури показывает лучшее использование - вы используете условный оператор, чтобы определить, к какому квадрату добавить элемент, а затем вызываете метод для этого.

4 голосов
/ 15 января 2011

1001 * попробовать *

(piece.isWhite() ? whitePieceSquares : blackPieceSquares).add(getSquare(pos));

РЕДАКТИРОВАТЬ: Не уверен, почему есть сомнения, это правильное утверждение. Вот более короткий пример, который вы сможете скомпилировать / запустить.

boolean out = true;
(out ? System.out : System.err).println("Hello");
2 голосов
/ 15 января 2011

В C это было бы возможно, потому что вы можете написать что-то вроде

void foo(int bar) {
    bar;
}

В Java вы не можете, и я не скучаю по этому.Однако, если вам по какой-то причине не нравится писать if ... else ..., это должно скомпилироваться:

(piece.isWhite() ? whitePieceSquares : blackPieceSquares).add(getSquare(pos));
1 голос
/ 15 января 2011

В основном ответ таков: просто потому что. ?: и все арифметические операторы могут появляться только в правой части выражения.

0 голосов
/ 15 января 2011

Я предполагаю, что ваши add функции возвращают логическое значение.Те должны куда-то идти, не так ли?

...