我已经使用Java几年了,但是直到最近我还没有遇到过这种构造:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但是有人可以解释吗?我该如何阅读?我很确定我知道它是如何工作的。
- 如果
isHere
为真,getHereCount()
则称为 - 如果
isHere
为假,getAwayCount()
则调用。
正确?这个结构叫做什么?
我已经使用Java几年了,但是直到最近我还没有遇到过这种构造:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但是有人可以解释吗?我该如何阅读?我很确定我知道它是如何工作的。
isHere
为真,getHereCount()
则称为isHere
为假,getAwayCount()
则调用。正确?这个结构叫做什么?
Answers:
是的,它是
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
它称为条件运算符。许多人(错误地)将其称为三元运算符,因为它是Java,C,C ++以及其他许多语言中唯一的三元运算符。但是理论上可以有另一个三元运算符,而只能有一个条件运算符。
官方名称在Java语言规范中给出:
§15.25条件运算符 :
条件运算符
? :
使用一个表达式的布尔值来确定应评估另外两个表达式中的哪一个。
请注意,两个分支都必须导致带有返回值的方法:
第二个或第三个操作数表达式是void方法的调用是编译时错误。
实际上,根据表达式语句的语法(第14.8节),不允许在可能出现调用void方法的任何上下文中出现条件表达式。
因此,如果doSomething()
和doSomethingElse()
是无效方法,则无法压缩此方法:
if (someBool)
doSomething();
else
doSomethingElse();
到这个:
someBool ? doSomething() : doSomethingElse();
简单的话:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
the
在的斜体中the ternary operator
,这就是他的意思是错误的,而不是ternary operator
错误的。在三元运算符暗示,迈克尔说,这是唯一的一个,这反过来又可能导致一个假设不能有任何其他的三元运营商,这是迈克尔说是错误的,而且我同意,这将是一个错误的假设。
其他人已经在合理范围内回答了这个问题,但通常使用“三元运算符”的名称。
作为我自己的学徒,我想明确指出运算符的名称是条件运算符或“条件运算符?:”。它是一个三元运算符(因为它具有三个操作数),并且碰巧是目前Java中唯一的三元运算符。
但是,该规范非常清楚,它的名称是条件运算符或“条件运算符?:”,这是绝对明确的。我认为用该名称称呼更清楚,因为它在某种程度上指示了运算符的行为(评估条件),而不是仅仅表示它具有多少个操作数。
&&
条件和运算符,以及||
条件或运算符,而只使用“条件运算符” ?:
。
根据Sun Java Specification,它称为条件运算符。请参阅第15.25节。你是对的,对的。
条件运算符?:使用一个表达式的布尔值来决定要对另外两个表达式中的哪一个进行求值。
条件运算符在语法上是右联想的(它从右到左分组),因此a?b:c?d:e?f:g的含义与a?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编码,将始终导致更多字节码。
三元,有条件的;番茄,tomatoh。真正有用的是变量初始化。如果(像我一样)喜欢在定义变量的地方初始化变量,则条件三元运算符(因为它们都是两者)允许您在变量值存在条件的情况下执行此操作。在最终领域中尤其值得注意,但在其他领域也很有用。
例如:
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
如果没有该运算符(无论使用什么名称),您都必须使该字段为非最终值,或者编写一个函数来对其进行初始化。实际上,这是不对的-至少在Java中,仍然可以使用if / else对其进行初始化。但是我发现这种清洁剂。
这种构造在计算机科学和编程技术中称为三元运算符。
和维基百科提出了如下解释:
在计算机科学中,三元运算符(有时错误地称为三元运算符)是一个带有三个参数的运算符。参数和结果可以是不同的类型。许多使用类似于C的语法的编程语言都具有三元运算符?:,它定义了条件表达式。
不仅在Java中,此语法在PHP中也可以在Objective-C中使用。
在下面的链接中,它给出了以下解释,这对于理解它是非常好的:
三元运算符是对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);
}
而已!
希望这对某人有帮助!
干杯!
您可能对针对一些与条件运算符相似的新运算符的提案感兴趣。空安全运算符将启用以下代码:
String s = mayBeNull?.toString() ?: "null";
自动拆箱的地方特别方便。
Integer ival = ...; // may be null
int i = ival ?: -1; // no NPE from unboxing
它已根据JDK 7的“项目硬币” 进行了进一步选择。
我碰巧真的很喜欢这个运算符,但是应该考虑读者。
您始终必须在代码紧凑性和阅读时间之间取得平衡,因为它存在一些非常严重的缺陷。
首先,有原始阿斯克案。他只是花了一个小时发布有关它的内容,并阅读了回复。作者每写一次要花多长时间?:一生中是否/曾经如此。不到一个小时就可以确定。
其次,在类似C的语言中,您习惯于简单地知道条件是该行的第一件事。当我使用Ruby时,我注意到了这一点,并且遇到了类似以下行:
callMethodWhatever(Long + Expression + with + syntax) if conditional
如果我是Ruby的长期用户,那么这行可能不会有问题,但是来自C,当您看到“ callMethodWhatever”是该行的第一件事时,您希望它会被执行。?:不太神秘,但是仍然足以使读者失望。
但是,优点是当您可以在三行中的1行中写一条三行if语句时,您的肚子会感觉很酷。不能否认:)但是,老实说,仅仅因为它的稀有性,不一定90%的人就可以阅读。
当它确实是一个基于布尔值和值的赋值时,我对此没有任何问题,但是很容易被滥用。
条件表达式的样式完全不同,语句中没有明确的条件。
语法为:boolean-expression?expression1:expression2;
该条件表达式的结果是
如果布尔表达式为true,则为expression1;否则为false。
否则结果为expression2。
假设您要分配更大数量的变量num1和num2到max。您可以简单地使用条件表达式编写一条语句:max =(num1> num2)?num1:num2;
注意:符号?和:一起出现在条件表达式中。它们形成条件运算符,也称为三元运算符,因为它使用三个操作数。它是Java中唯一的三元运算符。
引用自:Y. Daniel Liang第126-127页Java编程简介第10版