什么是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); }
不完全正确,确切地说:
- 如果isHere为true,则返回 getHereCount()的结果
- 其他返回 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%以上的人可读性只是因为其“稀有”。
当它是一个真正的基于布尔值的赋值时,我并没有问题,但它很容易被滥用。