【问题标题】:Ternary operator unknown behavior三元运算符未知行为
【发布时间】:2018-07-10 09:25:40
【问题描述】:

我编写了一个小程序,它从控制台获取 3 个数字并计算平方。

import java.util.Scanner;

public class TheatreSquare {

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    int m = scanner.nextInt();
    int a = scanner.nextInt();

    long i = n / a + n % a != 0 ? 1 : 0;
    long j = m / a + m % a != 0 ? 1 : 0;

    System.out.println(i);
    System.out.println(j);
    System.out.println((long)i*j);
}
}

我在测试过程中遇到的问题如下 - 当您输入数字时: 1000000000 1000000000 1

它返回: 1 1 1

虽然它应该返回 1000000000 1000000000 1000000000000000000

如果你用括号覆盖这两个三元运算符,结果将是正确的。但它是如何影响它的呢?据我所知,执行顺序应该是一样的,这里没有溢出。那么为什么会这样呢?

【问题讨论】:

  • 如果括号改变了结果,那么执行的顺序显然和没有的不一样。写出这样的代码不是一个聪明的主意。您可以像现在一样假设错误的执行顺序,并且代码完全不可读。不要写不好的代码。
  • 你的意思是(n/a + n%a != 0) ? 1 : 0 吗?还是您的意思是n/a + (n%a != 0 ? 1 : 0)?他们显然有不同的结果。
  • 我的意思是:long i = n / a + (n % a != 0 ? 1 : 0);长 j = m / a + (m % a != 0 ? 1 : 0);他们有吗?三元的优先级最低,无论如何都应该在最后时刻执行。

标签: java java-8


【解决方案1】:

检查运算符优先顺序表here:三元运算符出现在最后一个位置,在(不)相等运算符或算术运算符之后,所以没有括号你要先评估n / a + n % a != 0,然后评估result ? 1 : 0,然后将其分配给您的变量。

如果这不符合您的口味,请添加括号。

即使这是您想要的,添加括号也会大大提高可读性。

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 2012-08-08
    • 2017-03-05
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多