【问题标题】:ternary operator not working三元运算符不工作
【发布时间】:2013-07-12 05:41:42
【问题描述】:

Netbeans 说我的三元运算符不是语句。怎么会?

int direction;
direction = (Math.random() < 0.5) ? 0 : 1; // direction is either L or R (0 or 1)
direction == 0 ? System.out.print('L') : System.out.print('R');

我试过它的 if/then/else 对应,它工作正常:

int direction;
direction = (Math.random() < 0.5) ? 0 : 1; // direction is either L or R (0 or 1)
if(direction == 0){
    System.out.print('L');
} else {
    System.out.print('R');
}

【问题讨论】:

标签: java ternary-operator


【解决方案1】:

三元运算符旨在评估两个表达式之一,而不是执行两个语句之一。 (如果函数被声明为返回值,则调用函数可以是表达式;但是,System.outPrintStreamPrintStream.printvoid 函数。)您可以坚持使用 if...else 结构对于您正在尝试做的事情,或者您可以这样做:

System.out.print(direction == 0 ? 'L' : 'R');

注意:@iamcreasy 的评论指出我在上面的措辞中有些不准确。表达式可以计算为空,所以我应该说的是三元运算符计算两个 non-void 表达式之一。根据Java Language Specification §15.25

这是第二个或第三个操作数的编译时错误 表达式是对 void 方法的调用。

【讨论】:

  • 但是根据JLS 14.8 MethodInvocation 是一个表达式语句。那么这是否意味着表达式可以返回 void? (一般情况下)
  • @iamcreasy - 表达式确实可以是无效的(我不会使用“return void”,因为“return”在 JLS 中具有特定的技术含义)但在一般情况下不是,根据JLS §15.1 ,对表达式求值的结果可以是一个变量(类似于 C 中的 lvalue)、一个值或什么都不是(一个 void 表达式)。但是,空表达式 " 只能用作表达式语句(第 14.8 节),因为可以出现表达式的所有其他上下文都需要表达式来表示某些东西。”
【解决方案2】:

来自 JLS 部分15.25. Conditional Operator ?

第二个或第三个操作数表达式调用 void 方法是编译时错误。

这里的第二个和第三个操作数表达式:

direction == 0 ? System.out.print('L') : System.out.print('R');

void,所以这不是对三元表达式的有效使用。您可以坚持使用 if else 或使用类似于此替代方案的内容:

System.out.print( direction == 0 ? 'L' : 'R' );

这里的逻辑也不对:

direction = (int)(Math.random() * 1);

direction 将始终计算为0,因为Math.random() 生成范围[0.0,1.0) 中的数字,这意味着它不包括1.0,并且将double 转换为int 将只是drop the decimals。使用nextInt(2) 是一个不错的选择。

【讨论】:

  • +1 表示使用Math.random()。 OP 应该使用Math.random()*2 或创建java.util.Random 对象并使用nextInt(2)
  • 是的,实际上我一测试程序就发现了这一点。将其更改为方向 = (Math.random()
【解决方案3】:

三元运算符中的语句必须是非空的。他们需要退货。

System.out.println(direction == 0 ? 'L' : 'R');

【讨论】:

    猜你喜欢
    • 2012-01-04
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2019-12-10
    • 2021-02-06
    相关资源
    最近更新 更多