我已经使用java几年了,但直到最近我还没有遇到过这种结构:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但有人能解释一下吗?我怎么读呢?我很确定我知道它是怎么工作的。
如果 isHere
是的, getHereCount()
叫做,
如果 isHere
是假的 getAwayCount()
被称为。
对的这个结构叫什么?
我已经使用java几年了,但直到最近我还没有遇到过这种结构:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但有人能解释一下吗?我怎么读呢?我很确定我知道它是怎么工作的。
如果 isHere
是的, getHereCount()
叫做,
如果 isHere
是假的 getAwayCount()
被称为。
对的这个结构叫什么?
16条答案
按热度按时间3j86kqsm1#
这是条件运算符,它不仅仅是编写if语句的一种简洁方式。
因为它是一个返回值的表达式,所以可以作为其他表达式的一部分使用。
zaq34kh62#
是的,你说得对通常称为“三元条件运算符”,通常简称为“三元运算符”。它是标准if/else条件的简写版本。
三元条件算子
vyswwuz23#
我碰巧真的很喜欢这个操作符,但是应该考虑读者。
您总是需要在代码紧凑性和阅读时间之间取得平衡,因为它有一些相当严重的缺陷。
首先,有一个原始询问者的案例。他只是花了一个小时发布和阅读回复。作者要花多长时间才能写出每一个?:在他整个一生中作为一个if/then。一个小时也不能确定。
其次,在类c语言中,你习惯于只知道条件句是第一件事。我在使用ruby时注意到了这一点,遇到了如下几行:
如果我是一个长期使用ruby的用户,我可能不会对这一行有任何问题,但是来自c语言,当您看到“callMethodWhather”是这一行中的第一件事时,您希望它被执行。这个?:虽然不那么神秘,但仍然很不寻常,足以让读者感到厌烦。
然而,它的优点是,当你可以在其中一行的空间里写一个3行的if语句时,你会有一种非常酷的感觉。不能否认:)但老实说,90%的人不一定因为它的“稀有性”而更容易阅读。
当它真的是一个基于布尔和值的赋值时,我对它没有问题,但它很容易被滥用。
ovfsdjhp4#
条件表达式的样式完全不同,语句中没有显式if。
语法是:布尔表达式?表达式1:表达式2;
此条件表达式的结果是
表达式1,如果布尔表达式为真;
否则,结果为表达式2。
假设您想将较大数量的变量num1和num2分配给max。您只需使用条件表达式编写一条语句:max=(num1>num2)?num1:num2;
注意:符号?和:一起出现在条件表达式中。它们形成一个条件运算符,也称为三值运算符,因为它使用三个操作数。它是java中唯一的三元运算符。
引用自:y。梁大伟第126-127页
2q5ifsrm5#
是的,这是一种速记形式
它被称为条件运算符。许多人(错误地)称之为三元运算符,因为它是 java 、C、C++中的唯一三元(三参数)运算符,并且可能是许多其他语言。但理论上可以有另一个三元运算符,而只有一个条件运算符。
java语言规范中给出了官方名称:
§15.25条件运算符?:
条件运算符
? :
使用一个表达式的布尔值决定应计算其他两个表达式中的哪一个。请注意,两个分支都必须指向具有返回值的方法:
第二个或第三个操作数表达式调用void方法是编译时错误。
事实上,根据表达式语句语法(§14.8),条件表达式不允许出现在可能出现无效方法调用的任何上下文中。
那么,如果
doSomething()
及doSomethingElse()
如果是void方法,则无法压缩:为此:
简而言之:
llmtgqce6#
其他人已经在合理的程度上回答了这个问题,但通常使用“三元运算符”这个名称。
作为一个学究,我想明确指出,操作员的名字是条件运算符或“条件运算符”:。它是一个三值运算符(因为它有三个操作数),而且它恰好是目前java中唯一的三值运算符。
然而,规范非常清楚,它的名称是条件运算符或“条件运算符”:“这是绝对明确的。我认为用这个名字来称呼它更清楚,因为它在某种程度上表示操作符的行为(计算条件),而不仅仅是它有多少个操作数。
vlurs2pr7#
根据sun java规范,它被称为条件运算符。见第15.25节。你说得对。
条件运算符?:使用一个表达式的布尔值决定应计算其他两个表达式中的哪一个。
条件运算符在语法上是右联想的(它从右向左分组),因此a?b:c?d:e?f:g与a?b:(c?d:(e?f:g)的意思相同。
条件运算符有三个操作数表达式?出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间。
第一个表达式必须是boolean或boolean类型,否则会发生编译时错误。
zu0ti5jz8#
指:
liwlm1x99#
准确地说,不完全正确:
如果ishere为true,则返回getherecount()的结果
否则返回getawaycount()的结果
“返回”是非常重要的。这意味着这些方法必须返回一个值,并且该值必须分配到某个地方。
而且,它在语法上并不完全等同于if-else版本。例如:
如果用if-else编码,则总是会产生更多字节码。
dnph8jn410#
三元,有条件;西红柿,西红柿。它真正有价值的是变量初始化。如果(像我一样)您喜欢在定义变量的地方初始化变量,那么条件三元运算符(因为两者都是)允许您在其值存在条件的情况下进行初始化。在最后的领域尤其引人注目,但在其他领域也很有用。
例如。:
如果没有这个操作符,不管用什么名字,你都必须使这个字段成为非final的,或者写一个函数来初始化它。实际上,这是不对的——至少在java中,它仍然可以使用if/else进行初始化。但是我发现这个更干净。
carvr3hs11#
如果条件是
true
然后计算第一个表达式。如果条件是false
,对第二个表达式求值。它被称为条件运算符,是一种三值运算。
u0njafvf12#
这种结构在计算机科学和编程技术中被称为三元运算符。
维基百科给出了以下解释:
在计算机科学中,三元运算符(有时被错误地称为三元运算符)是一种具有三个参数的运算符。参数和结果可以是不同的类型。许多使用类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-else块的100%等价物:
就这样!
希望这对某人有帮助!
干杯
fv2wmkja13#
对的这叫做三元算子。有些人称之为条件运算符。
gcxthw6b14#
您可能对一些类似于条件运算符的新运算符的建议感兴趣。空安全运算符将启用如下代码:
在自动拆箱的地方,这将特别方便。
在jdk 7的“硬币项目”中,它被选为进一步考虑的对象
6ovsh4lw15#
它的三元算子(?)