在 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 数组,则不会编译。
谢谢,即使它不会编译,你能解释一下三元运算符如何与 += 一起工作吗?
如果rounds
是int[]
,这是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 将 i
和 START
添加到 3 并将其添加到 score
。第二次i
是1
而rounds[i]
是false
,所以只添加了0。
您询问的语句为score
添加了一个值。如果rounds[i]
可以评估为真,则添加的值为i + START
,如果为false
,则为0。如果i
和START
都是数字,则会添加一个数字。如果 score
是数字,加 0 通常没有区别,所以你可能会认为只有当 rounds[i]
为真时该语句才加值。
所以它是 score += round[i] == i+start 或 == 0。
不,语句中没有隐含的==
比较(正如其他人所说,它要求rounds[i]
是一个布尔值,真或假)。
【讨论】:
感谢您的解释。它完全深入地解释了我要求澄清的内容! 如果你喜欢这个答案并且满足你的要求,你应该考虑接受它。【参考方案4】:三元运算符?:
使用如下:
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 澄清中使用 += 和三元运算符的主要内容,如果未能解决你的问题,请参考以下文章