【问题标题】:When does this post-incrementation happen?这种后增量何时发生?
【发布时间】:2021-01-25 07:32:17
【问题描述】:

我面前有这段 Java 代码:

private static int[] generateSparseArray(int value) {
    int[] array = new int[getBound(value)];
    for (int j = 1; j < value; j++) {
        do {
            array[j++] = value;
            if ((value++ > 3 || value < 4) && (j > 0)) {
                ++j;
                break; 
            }
        } while (value < 4); 
    }
    return array; 
}

private static int getBound(int value) { /** ... */ }

我不确定这是否会在专门检查这部分布尔表达式之后增加“值”,或者它是否会在 if 语句的整个布尔表达式之后增加。

你们觉得呢?

【问题讨论】:

  • 请避免在问题中使用图片来显示代码。相反,将代码文本放入您的问题中。请edit它。为什么 ?下一个有类似问题的人的可搜索性。

标签: java if-statement increment


【解决方案1】:

这与在if 声明中没有任何关系;它只是表达式评估。

the Java Lanaguage Specification 中明确说明了该操作。

二元运算符的左侧操作数似乎已被完全计算 在计算右侧操作数的任何部分之前。

【讨论】:

    【解决方案2】:

    后增量是在评估value 之后立即完成的,而不是在评估整个if 条件之后。

    看看(value++ &gt; 3 || value &lt; 4)value3

    • value 被评估并且是3,所以条件的第一部分是false
    • 紧接着value 增加到4
    • 由于 OR 表达式的第一部分为假,因此对第二部分求值且未短路。
    • 现在value 已经是4 并且条件的第二部分也是false

    您可以通过查看精简版本来验证这一点。

    public static void main(String[] args) {
        int a = 3;
        if((a++ > 3 || a < 4) && verify(a)) {
    
        }
    }
    
    static boolean verify(int a) {
        System.out.println(a);
        return true;
    }
    

    永远不会调用verify 方法,也不会打印任何内容,因为(a++ &gt; 3 || a &lt; 4)false 并且会发生短路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多