什么是java?:调用了运算符,它做了什么?

2skhul33  于 2021-08-20  发布在  Java
关注(0)|答案(16)|浏览(469)

我已经使用java几年了,但直到最近我还没有遇到过这种结构:

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

这可能是一个非常简单的问题,但有人能解释一下吗?我怎么读呢?我很确定我知道它是怎么工作的。
如果 isHere 是的, getHereCount() 叫做,
如果 isHere 是假的 getAwayCount() 被称为。
对的这个结构叫什么?

3j86kqsm

3j86kqsm1#

这是条件运算符,它不仅仅是编写if语句的一种简洁方式。
因为它是一个返回值的表达式,所以可以作为其他表达式的一部分使用。

zaq34kh6

zaq34kh62#

是的,你说得对通常称为“三元条件运算符”,通常简称为“三元运算符”。它是标准if/else条件的简写版本。
三元条件算子

vyswwuz2

vyswwuz23#

我碰巧真的很喜欢这个操作符,但是应该考虑读者。
您总是需要在代码紧凑性和阅读时间之间取得平衡,因为它有一些相当严重的缺陷。
首先,有一个原始询问者的案例。他只是花了一个小时发布和阅读回复。作者要花多长时间才能写出每一个?:在他整个一生中作为一个if/then。一个小时也不能确定。
其次,在类c语言中,你习惯于只知道条件句是第一件事。我在使用ruby时注意到了这一点,遇到了如下几行:

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

如果我是一个长期使用ruby的用户,我可能不会对这一行有任何问题,但是来自c语言,当您看到“callMethodWhather”是这一行中的第一件事时,您希望它被执行。这个?:虽然不那么神秘,但仍然很不寻常,足以让读者感到厌烦。
然而,它的优点是,当你可以在其中一行的空间里写一个3行的if语句时,你会有一种非常酷的感觉。不能否认:)但老实说,90%的人不一定因为它的“稀有性”而更容易阅读。
当它真的是一个基于布尔和值的赋值时,我对它没有问题,但它很容易被滥用。

ovfsdjhp

ovfsdjhp4#

条件表达式的样式完全不同,语句中没有显式if。
语法是:布尔表达式?表达式1:表达式2;
此条件表达式的结果是
表达式1,如果布尔表达式为真;
否则,结果为表达式2。
假设您想将较大数量的变量num1和num2分配给max。您只需使用条件表达式编写一条语句:max=(num1>num2)?num1:num2;
注意:符号?和:一起出现在条件表达式中。它们形成一个条件运算符,也称为三值运算符,因为它使用三个操作数。它是java中唯一的三元运算符。
引用自:y。梁大伟第126-127页

2q5ifsrm

2q5ifsrm5#

是的,这是一种速记形式

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

它被称为条件运算符。许多人(错误地)称之为三元运算符,因为它是 java 、C、C++中的唯一三元(三参数)运算符,并且可能是许多其他语言。但理论上可以有另一个三元运算符,而只有一个条件运算符。
java语言规范中给出了官方名称:

§15.25条件运算符?:

条件运算符 ? : 使用一个表达式的布尔值决定应计算其他两个表达式中的哪一个。
请注意,两个分支都必须指向具有返回值的方法:
第二个或第三个操作数表达式调用void方法是编译时错误。
事实上,根据表达式语句语法(§14.8),条件表达式不允许出现在可能出现无效方法调用的任何上下文中。
那么,如果 doSomething()doSomethingElse() 如果是void方法,则无法压缩:

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

为此:

someBool ? doSomething() : doSomethingElse();

简而言之:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
llmtgqce

llmtgqce6#

其他人已经在合理的程度上回答了这个问题,但通常使用“三元运算符”这个名称。
作为一个学究,我想明确指出,操作员的名字是条件运算符或“条件运算符”:。它是一个三值运算符(因为它有三个操作数),而且它恰好是目前java中唯一的三值运算符。
然而,规范非常清楚,它的名称是条件运算符或“条件运算符”:“这是绝对明确的。我认为用这个名字来称呼它更清楚,因为它在某种程度上表示操作符的行为(计算条件),而不仅仅是它有多少个操作数。

vlurs2pr

vlurs2pr7#

根据sun java规范,它被称为条件运算符。见第15.25节。你说得对。
条件运算符?:使用一个表达式的布尔值决定应计算其他两个表达式中的哪一个。
条件运算符在语法上是右联想的(它从右向左分组),因此a?b:c?d:e?f:g与a?b:(c?d:(e?f:g)的意思相同。

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

条件运算符有三个操作数表达式?出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间。
第一个表达式必须是boolean或boolean类型,否则会发生编译时错误。

zu0ti5jz

zu0ti5jz8#

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

指:

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

liwlm1x99#

准确地说,不完全正确:
如果ishere为true,则返回getherecount()的结果
否则返回getawaycount()的结果
“返回”是非常重要的。这意味着这些方法必须返回一个值,并且该值必须分配到某个地方。
而且,它在语法上并不完全等同于if-else版本。例如:

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

如果用if-else编码,则总是会产生更多字节码。

dnph8jn4

dnph8jn410#

三元,有条件;西红柿,西红柿。它真正有价值的是变量初始化。如果(像我一样)您喜欢在定义变量的地方初始化变量,那么条件三元运算符(因为两者都是)允许您在其值存在条件的情况下进行初始化。在最后的领域尤其引人注目,但在其他领域也很有用。
例如。:

public class Foo {
    final double    value;

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

如果没有这个操作符,不管用什么名字,你都必须使这个字段成为非final的,或者写一个函数来初始化它。实际上,这是不对的——至少在java中,它仍然可以使用if/else进行初始化。但是我发现这个更干净。

carvr3hs

carvr3hs11#

condition ? truth : false;

如果条件是 true 然后计算第一个表达式。如果条件是 false ,对第二个表达式求值。
它被称为条件运算符,是一种三值运算。

u0njafvf

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 ( 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);
}

就这样!
希望这对某人有帮助!
干杯

fv2wmkja

fv2wmkja13#

对的这叫做三元算子。有些人称之为条件运算符。

gcxthw6b

gcxthw6b14#

您可能对一些类似于条件运算符的新运算符的建议感兴趣。空安全运算符将启用如下代码:

String s = mayBeNull?.toString() ?: "null";

在自动拆箱的地方,这将特别方便。

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

在jdk 7的“硬币项目”中,它被选为进一步考虑的对象

6ovsh4lw

6ovsh4lw15#

它的三元算子(?)

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.

相关问题