三元运算符不工作

时间:2013-07-14 02:14:17

标签: java ternary-operator

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');
}

3 个答案:

答案 0 :(得分:13)

三元运算符中的语句必须是无效的。他们需要归还一些东西。

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

答案 1 :(得分:9)

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

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

注意:@iamcreasy的评论指出我对上述内容的处理方式有点不精确。表达式可以评估为空,所以我应该说的是三元运算符评估两个void 表达式中的一个。根据{{​​3}}:

  

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

答案 2 :(得分:5)

来自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并投放{{1} } double只会drop the decimals。使用nextInt(2)是一个不错的选择。