使用条件运算符而不分配其结果

发布于 2024-10-12 08:14:32 字数 421 浏览 8 评论 0原文

为什么我必须将以下条件表达式的结果分配给变量才能编译?

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

上面的代码无法编译,下面的代码可以编译:

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

List#add() 返回一个布尔值,但我会忽略它。难道条件运算符的设计方式是需要对函数返回的值进行赋值,并且这些返回函数必须具有相同的类型?

Why do I have to assign the result of the following conditional expression to a variable to get it to compile?

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

The above doesn't compile, the below does:

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

List#add() returns a boolean, but I would just ignore that. Is it just that the conditional operator is designed in such a way that it's necessary to assign values returned from functions and those returning functions must have the same type?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

始终不够爱げ你 2024-10-19 08:14:32

来自 JLS 的第 14.8 节(表达式语句):

某些类型的表达式可以通过在其后面加上分号来用作语句:

表达式语句:
      语句表达式 ;

声明表达式:
       任务
       预增量表达式
       预减表达式
       后增量表达式
       后减表达式
       方法调用
       类实例创建表达式

表达式语句是通过计算表达式来执行的;如果表达式有值,则该值将被丢弃。当且仅当表达式的计算正常完成时,表达式语句的执行才能正常完成。

与 C 和 C++ 不同,Java 编程语言仅允许将某些形式的表达式用作表达式语句。

...

另一方面,该语言允许在表达式语句中使用所有最有用的表达式类型,并且不需要将方法调用用作表达式语句来调用 void 方法,因此几乎不需要这样的技巧。如果需要技巧,可以使用赋值语句(第 15.26 节)或局部变量声明语句(第 14.4 节)来代替。

基本上,条件运算符的原则目标是评估其操作数 - 您将其用于副作用。

Peter Lawrey 的答案显示了更好的用法 - 您使用条件运算符来计算出将棋子添加到哪个方格,然后调用该方法。

From section 14.8 of the JLS (expression statements):

Certain kinds of expressions may be used as statements by following them with semicolons:

ExpressionStatement:
      StatementExpression ;

StatementExpression:
       Assignment
       PreIncrementExpression
       PreDecrementExpression
       PostIncrementExpression
       PostDecrementExpression
       MethodInvocation
       ClassInstanceCreationExpression

An expression statement is executed by evaluating the expression; if the expression has a value, the value is discarded. Execution of the expression statement completes normally if and only if evaluation of the expression completes normally.

Unlike C and C++, the Java programming language allows only certain forms of expressions to be used as expression statements.

...

On the other hand, the language allows all the most useful kinds of expressions in expressions statements, and it does not require a method invocation used as an expression statement to invoke a void method, so such a trick is almost never needed. If a trick is needed, either an assignment statement (§15.26) or a local variable declaration statement (§14.4) can be used instead.

Basically, the principle aim of a conditional operator is to evaluate its operands - you're using it for the side-effects.

Peter Lawrey's answer shows a better use - you use the conditional operator to work out which square to add the piece to, and then you invoke the method on that.

空城之時有危險 2024-10-19 08:14:32

尝试

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

编辑:不知道为什么有人怀疑这是一个有效的陈述。这是一个较短的示例,您应该能够编译/运行。

boolean out = true;
(out ? System.out : System.err).println("Hello");

try

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

EDIT: Not sure why there is doubt this is a valid statement. Here is a shorter example which you should be able to compile/run.

boolean out = true;
(out ? System.out : System.err).println("Hello");
束缚m 2024-10-19 08:14:32

在 C 中,这是可能的,因为你可以写类似的东西,

void foo(int bar) {
    bar;
}

在 java 中,你不能,而且我不会错过它。但是,如果您出于某种原因不喜欢编写 if ... else ...,则应该编译:

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

In C, that would be possible, because you can write something like

void foo(int bar) {
    bar;
}

In java, you can't, and I don't miss it. However, if you for some reason don't like writing if ... else ..., this should compile:

(piece.isWhite() ? whitePieceSquares : blackPieceSquares).add(getSquare(pos));
﹉夏雨初晴づ 2024-10-19 08:14:32

基本上答案是:只是因为。 ?: 以及所有算术运算符只能出现在表达式的右侧。

Basically the answer is: just because. ?: and all the arithmetic operators can only appear on the right-hand side of an expression.

2024-10-19 08:14:32

我猜测您的 add 函数返回一个布尔值。那些人总得去某个地方,不是吗?

I'm guessing that your add functions return a boolean. Those have to go somwhere, don't they?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文