6

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

3 回答 3

15

三元运算符中的语句必须是非空的。他们需要返回一些东西。

System.out.println(direction == 0 ? 'L' : 'R');
于 2013-07-14T02:15:12.137 回答
9

三元运算符旨在评估两个表达式之一,而不是执行两个语句之一。(如果函数被声明为返回值,则调用函数可以是表达式;但是,System.outis aPrintStream并且PrintStream.printvoid函数。)您可以坚持使用该if...else结构来尝试执行该操作,也可以执行以下操作:

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

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

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

于 2013-07-14T02:17:50.737 回答
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并且强制转换doubleint只会删除小数。使用nextInt(2)是一个很好的选择。

于 2013-07-14T02:34:10.013 回答