在 java 澄清中使用 += 和三元运算符

Posted

技术标签:

【中文标题】在 java 澄清中使用 += 和三元运算符【英文标题】:using += and ternary operator in java clarification 【发布时间】:2020-07-29 02:35:32 【问题描述】:

我正在为即将到来的考试做一些练习题,遇到了一个我和我的同学似乎都能理解的问题。如下:

其中所有变量都是 int 或 int 数组。

score += (rounds[i]) ?我+开始:0

三元运算符如何在 java 中使用 += 工作? 这是我的理解:

所以它是 score += round[i​​] == i+start 或 == 0。

这是正确的理解吗?

亲切的问候, 詹姆斯

【问题讨论】:

如果 rounds 是一个 int 数组,则不会编译。 谢谢,即使它不会编译,你能解释一下三元运算符如何与 += 一起工作吗? 如果roundsint[],这是Java 编译时错误。如果您正在准备 OCA 或 OCP Java 考试,正确答案将是“编译时错误”。您可以考虑 like if ((rounds[i])) score += i + START; else score += 0; 希望对您有所帮助。你的例子有多余的() 我曾经在工作中遇到过一个真实的 Pascal 程序。这很新奇。 @JohnBollinger 我用 Pascal 操作系统遇到了真实世界的product。那是一个震惊。但是知道帕斯卡并没有直接帮助我。 【参考方案1】:

与运算符的任何组合一样,这是运算符优先级和(运算符具有相同优先级)关联性的问题。在 Java 中,简单赋值和所有运算符/赋值运算符共享最低优先级。三元运算符是下一个更高优先级的唯一占用者。因此,您的表达式相当于

score += ((rounds[i]) ? (i + START) : 0)

即对三元表达式求值,其结果是+=的右手操作数。

正如其他人所观察到的那样,如果rounds[i] 的类型是int,那么这在Java 中是无效的,尽管这在C 中可以。但是如果rounds[i] 是@ 的数组,则表达式在Java 中可能是合理的987654326@,也可以这样改写……

score += ((rounds[i] != 0) ? (i + START) : 0)

...假设需要对整数 rounds[i] 进行 C 风格的布尔解释。

【讨论】:

因为这是出于教学目的,并且因为我最近通过了 OCP Java 8 考试,所以我可以说这里的所有括号都是正确的但是它们也完全没有必要score += rounds[i] != 0 ? i + START : 0; 也是正确的(如果为那些考试而学习,你需要确切地知道什么是合法的,什么是不合法的)。 当然括号是不必要的,@ElliottFrisch。否则,添加它们不会产生等效的表达式。但我想再次强调这一点并没有什么坏处。恭喜您通过考试。 不用担心。谢谢。但我真的也与教授的原始形式形成对比:score += (rounds[i]) ? i + START : 0 其中括号是(IMO)退化的。【参考方案2】:
score += (some condition which is true or false) ? value to add if true : value to add if false;

【讨论】:

@OleV.V.再说一次,不是我。但这对我来说有明确的散文。它得到了赞成。【参考方案3】:

我们可以试试。

    int START = 3;

    int score = 0;
    boolean[] rounds =  true, false ;
    for (int i = 0; i < rounds.length; i++) 
        score += (rounds[i]) ? i + START : 0;
        System.out.format("i is %d, score is %d%n", i, score);
    

输出:

i is 0, score is 3
i is 1, score is 3

所以第一次循环i是0,rounds[i]true。在这种情况下,Java 将 iSTART 添加到 3 并将其添加到 score。第二次i1rounds[i]false,所以只添加了0。

您询问的语句为score 添加了一个值。如果rounds[i] 可以评估为真,则添加的值为i + START,如果为false,则为0。如果iSTART 都是数字,则会添加一个数字。如果 score 是数字,加 0 通常没有区别,所以你可能会认为只有当 rounds[i] 为真时该语句才加值。

所以它是 score += round[i​​] == i+start 或 == 0。

不,语句中没有隐含的== 比较(正如其他人所说,它要求rounds[i] 是一个布尔值,真或假)。

【讨论】:

感谢您的解释。它完全深入地解释了我要求澄清的内容! 如果你喜欢这个答案并且满足你的要求,你应该考虑接受它。【参考方案4】:

三元运算符?:使用如下:

a = 布尔表达式?如果为真,则为:否则为假。
        int start = 5;

        // In this case, start was added to itself to obtain 10.                
        start += true ? start  : 0;
        System.out.println(start); // prints 10

        // with out the compound assignment operator (+=) the
        // expression should be enclosed in () 
        start = start + (true ? start : 0);
        System.out.println(start); // prints 20

在上述情况下,如果布尔值为 false,则 start 始终具有值 5,因为每次都会添加 0

【讨论】:

谢谢老兄,这更清楚了。老师刚才搞错了。难怪我在任何地方都找不到它。 @OleV.V.不是一个反对的选民,但我想要一些带有答案的散文。此外,您可以使用false 添加一个示例。 从技术上讲,它是 JLS 15.25。 Conditional Operator ? : 并在“条件运算符”下的 Java Tutorials 中进行了描述。 好的,如果你真的想获得技术,我从 JLS 复制了这个。 三元条件运算符 ? : (§15.25) 所以我只用三元的简称。 @WJS 我包含了该部分的链接。它不包括三元一词。我知道这是一个三元组。所以你没有错。但是 Java 并没有这样称呼它。不要问我为什么。等等,由于某种原因,它包含15.28 的语言。多么痛苦。

以上是关于在 java 澄清中使用 += 和三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

如何在ajax调用中在jquery中使用三元运算符?

AngularJS - 在绑定中使用三元运算符和过滤器

只要不损害可读性,简单的三元情况是不是可以在程序流中使用?

在地图中使用reduce和三元时,我似乎遇到了麻烦

在不使用条件语句和三元运算符的情况下,在 C 中查找最多三个数

在 Objective-C 中使用三元运算符 + && 执行赋值和操作?