Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是Java?:调用了操作符,它做了什么?_Java_Syntax_Ternary Operator_Conditional Operator - Fatal编程技术网

什么是Java?:调用了操作符,它做了什么?

什么是Java?:调用了操作符,它做了什么?,java,syntax,ternary-operator,conditional-operator,Java,Syntax,Ternary Operator,Conditional Operator,我已经使用Java几年了,但直到最近我还没有遇到过这种结构: int count = isHere ? getHereCount(index) : getAwayCount(index); 这可能是一个非常简单的问题,但有人能解释一下吗?我怎么读呢?我很确定我知道它是怎么工作的 如果isHere为true,则调用getHereCount() 如果isHere为false,则调用getAwayCount() 对吗?这个结构叫什么?正确。它被称为。也有人称之为。是的,它是语言的简写形式 int

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

int count = isHere ? getHereCount(index) : getAwayCount(index);
这可能是一个非常简单的问题,但有人能解释一下吗?我怎么读呢?我很确定我知道它是怎么工作的

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

对吗?这个结构叫什么?

正确。它被称为。也有人称之为。是的,它是语言的简写形式

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);
它被称为条件运算符。许多人(错误地)称之为三元运算符,因为它是爪哇、C、C++中的唯一三元(三参数)运算符,并且可能是许多其他语言。但理论上可以有另一个三元运算符,而只有一个条件运算符

官方名称见:

§15.25条件运算符?: 条件运算符
?:使用一个表达式的布尔值来决定应计算其他两个表达式中的哪一个

请注意,两个分支都必须指向具有返回值的方法:

第二个或第三个操作数表达式调用void方法是编译时错误。

事实上,根据expression语句()的语法,条件表达式不允许出现在任何可能出现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条件的简写版本

如果条件为
true
,则计算第一个表达式。如果条件为
false
,请计算第二个表达式

它被称为,它是一种。

根据,它被称为条件运算符。见第15.25节。你说得对

条件运算符?:使用一个表达式的布尔值决定应计算其他两个表达式中的哪一个

条件运算符在语法上是右联想的(它从右向左分组),因此a?b:c?d:e?f:g与a?b:(c?d:(e?f:g)的意思相同

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


第一个表达式必须是boolean或boolean类型,否则会发生编译时错误。

它是条件运算符,而不仅仅是编写if语句的简洁方式


因为它是一个返回值的表达式,所以可以作为其他表达式的一部分使用。

其他人已经在合理的程度上回答了这个问题,但通常使用“三元运算符”这个名称

作为一个学究,我想明确指出,操作员的名字是条件运算符或“条件运算符”:。它是一个三值运算符(因为它有三个操作数),而且它恰好是目前Java中唯一的三值运算符


但是,该函数认为其名称是条件运算符或“条件运算符”:“是绝对明确的。我认为用这个名字来称呼它更清楚,因为它在某种程度上表示操作符的行为(评估条件),而不仅仅是它有多少个操作数。

确切地说,不完全正确:

  • 如果isHere为true,则返回getHereCount()的结果
  • 否则,getAwayCount()的结果将返回
  • “返回”是非常重要的。这意味着方法必须返回一个值,并且该值必须分配到某个地方

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

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

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

    我碰巧非常喜欢这个运算符,但应该考虑读取器

    您总是需要在代码紧凑性和阅读时间之间取得平衡,因为它有一些相当严重的缺陷

    首先,有一个原始询问者的案例。他只是花了一个小时发布和阅读回复。作者要花多长时间才能写出每一个?:在他整个一生中作为一个if/then。一个小时也不能确定

    其次,在类C语言中,你习惯于只知道条件句是第一件事。我在使用Ruby时注意到了这一点,遇到了如下几行:

    callMethodWhatever(Long + Expression + with + syntax) if conditional
    
    如果我是一个长期使用Ruby的用户,我可能不会对这一行有任何问题,但是来自C语言,当您看到“callMethodWhather”是这一行中的第一件事时,您希望它被执行。这个?:虽然不那么神秘,但仍然很不寻常,足以让读者感到厌烦

    然而,它的优点是,当你可以在其中一行的空间里写一个3行的if语句时,你会有一种非常酷的感觉。不能否认:)但老实说,90%的人不一定因为它的“稀有性”而更容易阅读


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

    三元,条件;西红柿,西红柿。它真正有价值的是变量初始化。如果(像我一样)您喜欢在定义变量的地方初始化变量,那么条件三元运算符(因为两者都是)允许您在其值存在条件的情况下进行初始化。特别显著
    ConditionalExpression:
            ConditionalOrExpression
            ConditionalOrExpression ? Expression : ConditionalExpression
    
    String str1,str2,str3,str4;
    boolean check;
    //...
    return str1 + (check ? str2 : str3) + str4;
    
    callMethodWhatever(Long + Expression + with + syntax) if conditional
    
    public class Foo {
        final double    value;
    
        public Foo(boolean positive, double value) {
            this.value = positive ? value : -value;
        }
    }
    
    String s = mayBeNull?.toString() ?: "null";
    
    Integer ival = ...;  // may be null
    int i = ival ?: -1;  // no NPE from unboxing
    
    if ( car.isStarted() ) {
         car.goForward();
    } else {
         car.startTheEngine();
    }
    
    ( car.isStarted() ) ? car.goForward() : car.startTheEngine();
    
    int count = isHere ? getHereCount(index) : getAwayCount(index);
    
    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.
    
    String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";