我几年来一直在使用Java,但直到最近我还没有碰到这个结构:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但有人可以解释一下吗?我该怎么看?我很确定我知道它是如何工作的。
isHere
为真,则调用getHereCount()
,isHere
为假,则会调用getAwayCount()
。正确?这个结构叫做什么?
答案 0 :(得分:174)
是的,它是
的简写形式int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
它被称为条件运算符。许多人(错误地)将其称为三元运算符,因为它是Java,C,C ++和许多其他语言中唯一的三元(三参数)运算符。但理论上可以是另一个三元运算符,而只能有一个条件运算符。
官方名称见Java Language Specification:
§15.25条件运算符? :
条件运算符
? :
使用一个表达式的布尔值来决定应该评估其他两个表达式中的哪一个。
请注意,两个分支必须指向具有返回值的方法:
第二个或第三个操作数表达式是void方法的调用是编译时错误。
实际上,通过表达式语句(§14.8)的语法,条件表达式不允许出现在可能出现void方法调用的任何上下文中。 / EM>
因此,如果doSomething()
和doSomethingElse()
是无效方法,则无法压缩:
if (someBool)
doSomething();
else
doSomethingElse();
进入这个:
someBool ? doSomething() : doSomethingElse();
简单的话:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
答案 1 :(得分:29)
其他人已经在合理的范围内回答了这个问题,但通常使用“三元运算符”这个名称。
作为我的学究者,我想说明运算符的名称是条件运算符还是“条件运算符?:”。它是一个三元运算符(因为它有三个操作数),它恰好是目前Java中唯一的三元运算符。
但是,spec is pretty clear的名称是条件运算符或“条件运算符?:”是绝对明确的。我认为通过该名称调用它更清楚,因为它在某种程度上指示了运算符的行为(评估条件)而不是它有多少个操作数。
答案 2 :(得分:17)
根据Sun Java Specification,它被称为条件运算符。见15.25节。你对它的作用是正确的。
条件运算符? :使用一个表达式的布尔值来决定应该评估两个其他表达式中的哪一个。
条件运算符在语法上是右关联的(它从右到左分组),因此a?b:c?d:e?f:g表示与?b相同:(c?d :( ?电子网:克))
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
条件运算符有三个操作数表达式; ?出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间。
第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误。
答案 3 :(得分:5)
确切地说,不完全正确:
“返回”非常重要。这意味着方法必须返回一个值,并且值必须分配到某处。
此外,它的不完全在语法上等同于if-else版本。例如:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
如果使用if-else编码将始终产生更多的字节码。
答案 4 :(得分:4)
int count = isHere ? getHereCount(index) : getAwayCount(index);
表示:
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
答案 5 :(得分:3)
condition ? truth : false;
如果条件为true
,则返回第一个参数。如果条件为false
,则返回第二个参数。
它被称为Conditional Operator,它是Ternary Operation的一种类型。
答案 6 :(得分:3)
三元,有条件的;番茄,番茄。它的真正价值在于变量初始化。如果(像我一样)你喜欢初始化定义它们的变量,那么条件三元运算符(因为它是两者)允许你在有关其值的条件性的情况下这样做。特别值得注意的是在最后的领域,但在其他地方也很有用。
e.g:
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
如果没有那个操作符 - 无论名称是什么 - 你必须使字段非最终或写一个函数只是为了初始化它。实际上,这是不对的 - 它仍然可以使用if初始化/ else,至少在Java中。但我觉得这个更干净了。
答案 7 :(得分:2)
正确。 称为 ternary operator。有些人还称之为conditional operator。
答案 8 :(得分:2)
其三元运算符(?:)
The ternary operator is an operator that takes three arguments. The first
argument is a comparison argument, the second is the result upon a true
comparison, and the third is the result upon a false comparison.
答案 9 :(得分:1)
对于某些与条件运算符类似的新运算符,您可能对proposal感兴趣。 null安全运算符将启用如下代码:
String s = mayBeNull?.toString() ?: "null";
自动拆箱的地方特别方便。
Integer ival = ...; // may be null
int i = ival ?: -1; // no NPE from unboxing
在JDK 7的“Project Coin”下已经selected for further consideration。
答案 10 :(得分:1)
实际上,它可以接受3个以上的参数。例如,如果我们要检查数字是正数,负数还是零,我们可以这样做:
String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";
这比使用if,else if,else更好。
答案 11 :(得分:0)
是的,你是对的。 ?:通常称为“三元条件运算符”,通常简称为“三元运算符”。它是标准if / else条件的简写版本。
答案 12 :(得分:0)
它是条件运算符,它不仅仅是编写if语句的简洁方法。
因为它是一个返回值的表达式,所以它可以用作其他表达式的一部分。
答案 13 :(得分:0)
我碰巧真的喜欢这个操作符,但应该考虑读者。
你总是需要平衡代码紧凑性和阅读时间,并且它有一些相当严重的缺陷。
首先,有原始Asker的案例。他只花了一个小时发布它并阅读回复。作者在整个人生的整个过程中花了多长时间才能写出来?不是一个小时可以确定。
其次,在类C语言中,你习惯于简单地知道条件是行中的第一件事。当我使用Ruby时,我注意到了这一点,并且遇到了以下几行:
callMethodWhatever(Long + Expression + with + syntax) if conditional
如果我是一个很长时间的Ruby用户,我可能不会遇到这一行的问题,但是来自C,当你看到“callMethodWhatever”作为行中的第一件事时,你期望它被执行。 ?:不那么神秘,但仍然不足以让读者离开。
然而,当你可以在1行的空格中写出3行if语句时,优势在于你的肚子真的很酷。不能否认:)但老实说,90%的人只是因为它的“稀有性”而不一定更具可读性。
当它真的是基于布尔值和值的赋值时,我没有问题,但它很容易被滥用。
答案 14 :(得分:0)
条件表达式的样式完全不同,语句中没有明确的条件。
语法为: 布尔表达式? expression1:expression2;
此条件表达式的结果是
expression1,如果boolean-expression为true;否则为false。
否则,结果为expression2。
假设您要为max分配更大数量的变量num1和num2。您可以简单地使用条件表达式编写一条语句: max =(num1> num2)? num1:num2;
注意:符号?和:一起出现在条件表达式中。它们形成条件运算符,也称为三元运算符,因为它使用三个操作数。它是Java中唯一的三元运算符。
引自:Y. Daniel Liang第126-127页Java编程简介第10版。