什么是Java?:操作符被调用,它有什么作用?

我一直在使用Java几年,但直到最近我还没有运行这个构造:

int count = isHere ? getHereCount(index) : getAwayCount(index); 

这可能是一个非常简单的问题,但有人可以解释吗? 我如何阅读? 我很确定我知道它是如何工作的。

  • 如果isHere为真,则调用getHereCount()
  • 如果isHere为false,则调用getAwayCount()

正确? 这个结构叫做什么?

是的,这是一个简短的forms

 int count; if (isHere) count = getHereCount(index); else count = getAwayCount(index); 

它被称为条件运算符 。 很多人(错误地)把它称为三元运算符 ,因为它是Java,C,C ++和其他许多语言中唯一的三元运算符(三参数)。 但理论上可能有另一个三元运算符,而只能有一个条件运算符

Java语言规范中给出了正式名称:

§15.25有条件的操作符? :

条件运算符? : ? :使用一个expression式的布尔值来决定应该评估哪两个expression式。

请注意,两个分支必须导致返回值的方法:

第二个或第三个操作数expression式是一个void方法的调用,这是一个编译时错误。

事实上,通过expression式语句的语法( §14.8 ),不允许条件expression式出现在任何可能出现void方法调用的上下文中。

所以,如果doSomething()doSomethingElse()是无效的方法,你不能压缩这个:

 if (someBool) doSomething(); else doSomethingElse(); 

进入这个:

 someBool ? doSomething() : doSomethingElse(); 

简单的话:

 booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

其他人已经在合理的范围内回答了这个问题,但往往以“三元运算符”这个名字。

作为我的学生,我想说清楚,运算符的名称是条件运算符还是“条件运算符?”。 这是一个三元操作符(它有三个操作数),它恰好是目前Java中唯一的三元运算符。

然而,这个规范很清楚 ,它的名字是条件运算符或“条件运算符?”,绝对是毫不含糊的。 我认为用这个名称来调用它会更清楚,因为它在一定程度上(操作条件的评估)表明了操作员的行为,而不仅仅是操作数有多less。

根据Sun Java规范 ,它被称为条件运算符。 见15.25节。 你说的是对的。

条件运算符? :使用一个expression式的布尔值来决定应该评估哪两个expression式。

条件运算符在语法上是右关联的(它从右到左),所以a?b:c?d:e?f:g的意思与a?b相同:(c?d:(e?f :G))。

 ConditionalExpression: ConditionalOrExpression ConditionalOrExpression ? Expression : ConditionalExpression 

条件运算符有三个操作数expression式; ? 出现在第一个和第二个expression式之间,并且:出现在第二个和第三个expression式之间。

第一个expression式必须是布尔型或布尔型,否则会发生编译时错误。

 int count = isHere ? getHereCount(index) : getAwayCount(index); 

意味着:

 if (isHere) { count = getHereCount(index); } else { count = getAwayCount(index); } 

不完全正确,确切地说:

  1. 如果isHere为true,则返回 getHereCount()的结果
  2. 其他返回 getAwayCount()的结果

这个“返回”是非常重要的。 这意味着这些方法必须返回一个值,并且该值必须在某处被赋值。

另外,它在语法上不完全等同于if-else版本。 例如:

 String str1,str2,str3,str4; boolean check; //... return str1 + (check ? str2 : str3) + str4; 

如果使用if-else编码将始终导致更多的字节码。

 condition ? truth : false; 

如果条件为true则返回第一个参数。 如果条件为false ,则返回第二个参数。

它被称为条件运算符 ,它是一种三元运算 。

三元的,有条件的; 番茄,西红柿。 真正有价值的是variables初始化。 如果(像我一样)喜欢在定义variables的地方初始化variables,那么有条件的三元运算符(就是这两个variables)允许你在这个variables有条件的情况下这样做。 在最后的领域尤其值得注意,但在其他地方也很有用。

例如:

 public class Foo { final double value; public Foo(boolean positive, double value) { this.value = positive ? value : -value; } } 

没有这个操作符 – 无论用什么名字 – 你都必须使这个字段不是最终的,或者只是写一个函数来初始化它。 实际上,这是不对的 – 至less在Java中,它仍然可以使用if / else来初始化。 但我觉得这个更清洁。

这个结构被称为计算机科学和编程技术中的三元运算符
维基百科提出以下解释:

在计算机科学中,三元运算符(有时被错误地称为三级运算符)是一个接受三个参数的运算符。 参数和结果可以是不同的types。 许多使用类C语法的编程语言都使用三元运算符?:来定义一个条件expression式。

不仅在Java中,该语法也可在PHP,Objective-C中使用。

在下面的链接中给出了下面的解释,这很好理解它:

三元运算符是对3个input进行操作的一些操作。 这是一个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的“项目投资” 选中 。

它的三元运算符(?:)

 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. 

这是条件运算符,它不仅仅是一个简洁的写if语句的方法。

由于它是一个返回值的expression式,因此可以用作其他expression式的一部分。

是的,你是对的。 ?:通常被称为“三元条件操作符”,通常简称为“三元操作符”。 它是标准if / else条件的简写版本。

三元条件运算符

我碰巧真的很喜欢这个操作员,但应该考虑到读者。

你总是不得不平衡代码的紧凑性和阅读的时间,因为它有一些非常严重的缺陷。

首先是原始提问者的情况。 他只花了一个小时的时间张贴,并阅读回应。 在作者的整个生命过程中,作者如何写作每一部作品呢? 没有一个小时可以肯定。

其次,在C语言中,你习惯于简单地知道条件是第一行。 当我使用Ruby时,我注意到这一点,并遇到如下线路:

 callMethodWhatever(Long + Expression + with + syntax) if conditional 

如果我是一个很长时间的Ruby用户,我可能不会有这个问题,但来自C,当你看到“callMethodWhatever”作为第一件事情,你期望它被执行。 这个?:不那么神秘,但仍然非常不寻常,以至于抛下读者。

然而,当你在1行的空格中写出3行if语句的时候,它的好处是你的肚子里真的很酷。 不能否认:)但说实话,不一定是90%以上的人可读性只是因为其“稀有”。

当它是一个真正的基于布尔值的赋值时,我并没有问题,但它很容易被滥用。