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');
}
答案 0 :(得分:13)
三元运算符中的语句必须是无效的。他们需要归还一些东西。
System.out.println(direction == 0 ? 'L' : 'R');
答案 1 :(得分:9)
三元运算符旨在评估两个表达式中的一个,而不是执行两个语句中的一个。 (如果声明函数返回值,则调用函数可以是表达式;但是,System.out
是PrintStream
而PrintStream.print
是void
函数。)您可以要么坚持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)
是一个不错的选择。