我使用 Java 已经有几年了,但是直到最近我还没有遇到过这个构造:
int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但有人能解释一下吗?我该怎么读?我很确定我知道它是怎么运作的。
isHere
getHereCount()
getAwayCount()
对吗? 这个构造叫什么?
正确。它是 电话的 三元运算符三元运算符。有人也叫它 条件运算符。
是的,它是
int count; if (isHere) count = getHereCount(index); else count = getAwayCount(index);
它叫 条件运算符。许多人(错误地)称它为 三元算符,因为它是 Java、 C、 C + + ,可能还有许多其他语言中唯一的三元(三个参数)操作符。但是理论上有 可以是另一个三元算子,而只能有一个 条件运算符。
官方名称在 Java 语言规范中给出:
15.25条件运算符? : 条件运算符 ? :使用一个表达式的布尔值来决定另外两个表达式中的哪一个应该求值。
条件运算符 ? :使用一个表达式的布尔值来决定另外两个表达式中的哪一个应该求值。
? :
注意,这两个分支都必须导致具有返回值的方法:
如果第二个或第三个操作数表达式是 void 方法的调用,则为编译时错误。 事实上,根据表达式语句的语法(14.8) ,条件表达式不允许出现在可能出现 void 方法调用的任何上下文中。
如果第二个或第三个操作数表达式是 void 方法的调用,则为编译时错误。
事实上,根据表达式语句的语法(14.8) ,条件表达式不允许出现在可能出现 void 方法调用的任何上下文中。
因此,如果 doSomething()和 doSomethingElse()是 void 方法,就不能压缩:
doSomething()
doSomethingElse()
if (someBool) doSomething(); else doSomethingElse();
变成这样:
someBool ? doSomething() : doSomethingElse();
简单的话:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
意思是:
if (isHere) { count = getHereCount(index); } else { count = getAwayCount(index); }
是的,你是对的。?: 通常称为“条件运算符”,通常简称为“三元操作符”。它是标准 if/else 条件的简写版本。
条件运算符
condition ? truth : false;
如果条件是 true,那么计算第一个表达式。如果条件是 false,那么计算第二个表达式。
true
false
它被称为 条件运算符,是 三元运算的一种类型。
根据 ABc0的说法,它叫做条件运算符,参见第15.25节,你对它的功能是正确的。
条件运算符?: 使用一个表达式的布尔值来决定应该计算另外两个表达式中的哪一个。
这个条件运算符在句法上是右联想的(它从右到左分组) ,所以 a? b: c? d: e? f: g 和 a? b: (c? d: (e? f: g)意思相同。
ConditionalExpression: ConditionalOrExpression ConditionalOrExpression ? Expression : ConditionalExpression
条件运算符有三个操作数表达式; ?出现在第一个和第二个表达式之间,以及: 出现在第二个和第三个表达式之间。
第一个表达式必须是 Boolean 或 Boolean 类型,否则将发生编译时错误。
这是一种条件运算符,它不仅仅是一种简洁的 if 语句的书写方式。
因为它是一个返回值的表达式,所以它可以作为其他表达式的一部分使用。
其他人已经在合理的程度上回答了这个问题,但是经常使用“三元操作符”这个名字。
作为一个书呆子,我想澄清一下,操作员的名字是“条件运算符”还是“条件运算符”?:".它是 一三元操作符(因为它有三个操作数) ,而且它恰好是目前 Java 中唯一的三元操作符。
然而,ABc0认为它的名字是条件运算符还是“条件运算符”?绝对明确。我认为用这个名字来称呼它更清楚,因为它在一定程度上指示了操作符的行为(评估一个条件) ,而不仅仅是它有多少个操作数。
准确地说,不完全正确:
“返回”是非常重要的。它意味着方法 必须的返回一个值,而这个值 必须的被赋给某个地方。
此外,它在语法上等同于 if-else 版本:
String str1,str2,str3,str4; boolean check; //... return str1 + (check ? str2 : str3) + str4;
如果使用 If-else 进行编码,则总是会产生更多的字节码。
我碰巧真的很喜欢这个操作员,但是读者应该被考虑在内。
您总是必须在代码紧凑性和阅读代码所花费的时间之间取得平衡,因此它有一些非常严重的缺陷。
首先,这是原始提问者的案子。他刚刚花了一个小时发帖,并阅读了回复。作者要花多长时间才能完成每一部作品?: 假设/然后贯穿他的一生。还不到一个小时。
其次,在类 C 语言中,您习惯于只知道条件句是行中的第一个词。我在使用 Ruby 时注意到了这一点,遇到了这样的行:
callMethodWhatever(Long + Expression + with + syntax) if conditional
如果我是一个长期使用 Ruby 的用户,我可能不会对这一行有什么问题,但是从 C 语言来看,当你在这一行的第一行看到“ callMethodwhatever”时,你希望它被执行。什么?: 不那么神秘,但仍然不同寻常,足以让读者。
然而,当你可以在一行的空格中写一个3行的 if 语句时,它的优势在于你的胃里有一种非常凉爽的感觉。不可否认这一点:)但说实话,90% 的人不一定因为它的稀有而更容易阅读。
当它真正是一个基于布尔值和值的赋值时,我对它没有意见,但它很容易被滥用。
三元的,有条件的; 西红柿,西红柿。它真正有价值的是变量初始化。如果(像我一样)你喜欢在定义变量的地方初始化它们,条件三元运算符(因为它两者都是)允许你在它的值有条件性的情况下这样做。在最终领域尤其显著,但在其他领域也很有用。
例如:
public class Foo { final double value; public Foo(boolean positive, double value) { this.value = positive ? value : -value; } }
如果没有这个操作符(不管是什么名字) ,那么必须使字段非 final,或者编写一个函数来初始化它。实际上,这是不对的-它仍然可以使用 if/else 进行初始化,至少在 Java 中是这样。但我找到了这个清洁工。
你可能会对一些类似条件运算符的新操作符的 建议书感兴趣。空安全运算符将启用如下代码:
String s = mayBeNull?.toString() ?: "null";
这将是特别方便的地方自动拆箱发生。
Integer ival = ...; // may be null int i = ival ?: -1; // no NPE from unboxing
它是 JDK7的“ ProjectCoin”下的 选定作进一步考虑
这种结构在计算机科学和编程技术中被称为 三元操作员:
在计算机科学中,三元算符(有时被错误地称为三元算符)是一种带有三个参数的算符。参数和结果可以是不同类型的。许多使用类 C 语法的编程语言都有一个三元运算符,?: ,它定义一个条件表达式。
不仅在 Java 中,这种语法也可以在 PHP 和 Objective-C 中使用。
在下面的 链接中,它给出了以下解释,理解起来非常好:
三元运算符是对3个输入进行操作的运算。这是 if-else 语句的快捷方式,也称为条件运算符。 在 Perl/PHP 中,它的工作原理是: < br/> boolean_condition ? true_value : false_value 在 C/C + + 中,它的工作原理是: < br/> logical expression ? action for true : action for false
三元运算符是对3个输入进行操作的运算。这是 if-else 语句的快捷方式,也称为条件运算符。
在 Perl/PHP 中,它的工作原理是: < br/> boolean_condition ? true_value : false_value
boolean_condition ? true_value : false_value
在 C/C + + 中,它的工作原理是: < br/> logical expression ? action for true : action for false
logical expression ? action for true : action for false
对于一些不太复杂的逻辑条件,这可能是可读的,否则最好使用 If-Else 块和条件逻辑的预期组合。
我们可以用这个三元运算符简化一行代码语句的 If-Else 块。 < br/> < strong > 例如:
if ( car.isStarted() ) { car.goForward(); } else { car.startTheEngine(); }
可能等于如下:
( car.isStarted() ) ? car.goForward() : car.startTheEngine();
因此,如果我们参考你的陈述:
它实际上是以下 If-Else 块的100% 等价物:
int count; if (isHere) { count = getHereCount(index); } else { count = getAwayCount(index); }
就是这样! 希望这对谁有帮助! 干杯!
它的三元算子(? :)
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.
实际上,它可以采取超过3个参数。例如,如果我们想检查一个数字是正数、负数还是零,我们可以这样做:
String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";
这比使用 if,else if,else 要好。
条件表达式的样式完全不同,语句中没有显式的 if。
语法是: 布尔表达式1: 表达式2;
这个条件表达式的结果是
如果布尔表达式为真,则为 Expression1;
否则结果就是 Expression2。
假设您想将变量 num1和 num2的较大数目赋给 max。您可以简单地使用条件表达式编写一条语句: Max = (num1 > num2) ? num1: num2;
注: 符号?和: 以条件表达式同时出现。它们形成一个条件运算符,也称为三元运算符,因为它使用三个操作数。它是 Java 中唯一的三元运算符。
引自: Java 编程入门第10版由 Y.DanielLiang 编写,第126-127页
? : 是一个三元 Java 操作符。
它的语法是:
condition ? expression1 : expression2;
这里,对 condition进行计算,然后
condition
condition返回 true,expression1将执行。
expression1
condition返回 false,expression2将执行。
expression2
公共类 Sonycode { Public static void main (String [] args){ 双分 = 90; 字符串结果 = (分数 > 40) ? “考试及格”: “考试不及格”; Println (“ Your result is:”+ result) ; } }
产出:-
Your result is : passed in exam