我已经使用Java几年了,但直到最近我还没有碰到这个结构:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但有人可以解释一下吗?我该怎么看?我很确定我知道它是如何工作的。
isHere
是真的,getHereCount()
被称为,isHere
是假的getAwayCount()
被称为。正确?这个结构叫做什么?
是的,它是一种速记形式
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
它被称为条件运算符。许多人(错误地)将其称为三元运算符,因为它是Java,C,C ++和许多其他语言中唯一的三元(三参数)运算符。但理论上可能有另一个三元运算符,而只能有一个条件运算符。
官方名称在Java Language Specification中给出:
§15.25 Conditional Operator ? :
条件运算符
? :
使用一个表达式的布尔值来决定应该评估两个其他表达式中的哪一个。
请注意,两个分支必须指向具有返回值的方法:
第二个或第三个操作数表达式是void方法的调用是编译时错误。
事实上,通过表达式语句(§14.8)的语法,条件表达式不允许出现在可能出现void方法调用的任何上下文中。
所以,如果doSomething()
和doSomethingElse()
是无效方法,你不能压缩这个:
if (someBool)
doSomething();
else
doSomethingElse();
进入这个:
someBool ? doSomething() : doSomethingElse();
简单的话:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
它的三元运算符(?:)
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.
对于一些类似于条件运算符的新运算符,您可能对proposal感兴趣。 null-safe操作符将启用如下代码:
String s = mayBeNull?.toString() ?: "null";
在自动拆箱发生时尤其方便。
Integer ival = ...; // may be null
int i = ival ?: -1; // no NPE from unboxing
它是在JDK 7的“项目硬币”下的selected for further consideration。
实际上它可能需要超过3个参数。例如,如果我们想要检查数字是正数,负数还是零数,我们可以这样做:
String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";
这比使用if更好,否则if,else。
它是条件运算符,它不仅仅是编写if语句的简洁方法。
由于它是一个返回值的表达式,因此可以将其用作其他表达式的一部分。
是的,你是对的。 ?:通常称为“三元条件运算符”,通常简称为“三元运算符”。它是标准if / else条件的简写版本。
我碰巧真的喜欢这个操作符,但应该考虑读者。
你总是需要平衡代码的紧凑性和阅读它的时间,并且它有一些非常严重的缺陷。
首先,有原始Asker的案例。他只花了一个小时发布它并阅读回复。作者在整个人生的整个过程中花了多长时间才能写出来?不是一个小时可以肯定。
其次,在类C语言中,你习惯于简单地知道条件是行中的第一件事。当我使用Ruby时,我注意到了这一点:
callMethodWhatever(Long + Expression + with + syntax) if conditional
如果我是一个很长时间的Ruby用户,我可能不会遇到这一行的问题,但是来自C,当你看到“callMethodWhatever”作为该行中的第一件事时,你期望它被执行。 ?:不那么神秘,但仍然不足以让读者失望。
然而,当你可以在1行的空间中写出3行if语句时,优点是在你的肚子里真的很酷。不能否认:)但老实说,90%的人只是因为它的“稀有性”而不一定更具可读性。
当它真的是基于布尔值和值的赋值时,我没有问题,但它很容易被滥用。
其他人已经在合理的范围内回答了这个问题,但通常使用“三元运算符”这个名称。
作为我的迂腐,我想清楚地表明运算符的名称是条件运算符或“条件运算符?:”。它是一个三元运算符(因为它有三个操作数),它恰好是目前Java中唯一的三元运算符。
但是,spec is pretty clear的名称是条件运算符或“条件运算符?:”是绝对明确的。我认为通过该名称调用它更清楚,因为它在某种程度上指示了运算符的行为(评估条件)而不是它有多少个操作数。
根据Sun Java Specification,它被称为条件运算符。见15.25节。你对它的作用是正确的。
条件运算符? :使用一个表达式的布尔值来决定应该评估两个其他表达式中的哪一个。
条件运算符在语法上是右关联的(它从右到左分组),因此a?b:c?d:e?f:g表示与?b相同:(c?d:(e?f) :G))。
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
条件运算符有三个操作数表达式; ?出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间。
第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误。
确切地说,不完全正确:
“返回”非常重要。这意味着方法必须返回一个值,并且该值必须在某处分配。
此外,它在语法上与if-else版本完全不同。例如:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
如果使用if-else编码将始终导致更多的字节码。
int count = isHere ? getHereCount(index) : getAwayCount(index);
意思是:
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
condition ? truth : false;
如果条件是true
,则返回第一个参数。如果条件是false
,则返回第二个参数。
它被称为Conditional Operator,它是一种Ternary Operation。
三元,有条件的;番茄,番茄。它的真正价值在于变量初始化。如果(像我一样)你喜欢初始化定义它们的变量,那么条件三元运算符(因为它是两者)允许你在有关其值的条件性的情况下这样做。特别值得注意的是最终领域,但在其他地方也很有用。
e.f.:
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
如果没有该运算符 - 无论名称如何 - 您必须使该字段非最终或仅编写函数来初始化它。实际上,这不对 - 它仍然可以使用if / else初始化,至少在Java中。但我觉得这个更清洁。
该构造在计算机科学和编程技术中称为三元算子。 并且Wikipedia建议以下解释:
在计算机科学中,三元运算符(有时被错误地称为第三运算符)是一个带有三个参数的运算符。参数和结果可以是不同的类型。许多使用类C语法的编程语言都有一个三元运算符?:,它定义了一个条件表达式。
不仅在Java中,这种语法在PHP,Objective-C中也可用。
在下面的link中,它给出了以下解释,这对于理解它很安静:
三元运算符是在3个输入上运行的一些操作。它是if-else语句的快捷方式,也称为条件运算符。
在Perl / PHP中,它的工作原理如下:
boolean_condition ? true_value : false_value
在C / C ++中,它的工作原理如下:
logical expression ? action for true : action for false
对于某些不太复杂的逻辑条件,这可能是可读的,否则最好将If-Else块与条件逻辑的预期组合一起使用。
我们可以使用这个三元运算符为一个代码语句行简化If-Else块。 例如:
if ( car.isStarted() ) {
car.goForward();
} else {
car.startTheEngine();
}
可能等于以下内容:
( car.isStarted() ) ? car.goForward() : car.startTheEngine();
所以如果我们参考你的陈述:
int count = isHere ? getHereCount(index) : getAwayCount(index);
它实际上是以下If-Else块的100%等价物:
int count;
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
而已! 希望这对某人有帮助! 干杯!
正确。它被称为ternary operator。有些人也称它为conditional operator。