Java Postfix 增量运算符行为

标签 java operators

在下面的示例代码中,为什么每个方法之后的最终值不同。我希望两者都显示“i = 1”

public class Test {

    public int i = 0;    

    public static void main( String args[] ) {        
        Test t = new Test();
        t.test();
    }

    public void test() {

        i = 0;
        System.out.println( "[start a] i = " + i );
        doSomethingA( i++ );
        System.out.println( "[end   a] i = " + i );

        System.out.println( "---------------------" );

        i = 0;
        System.out.println( "[start b] i = " + i );
        doSomethingB( i++ );
        System.out.println( "[end   b] i = " + i );

    }

    // Direct assignment of passed value
    public void doSomethingA( int x ) {
        i = x;
    }

    // Equation of passed value
    public void doSomethingB( int x ) {
        i += x;
    }

}

结果是:

[start a] i = 0
[end   a] i = 0
---------------------
[start b] i = 0
[end   b] i = 1

为什么我在方法中对“i”所做的事情很重要,在方法结束后它不应该增加 1 吗?

在这两种情况下,我都在方法内将“i”的值分配为 0。

谢谢

最佳答案

以下是从 test 调用这两个方法时发生的情况。

首先。

i0 开始,并打印 0i++ 被评估。因为它是后递增,所以表达式值是旧值 0,因此这就是传递给 doSomethingA 的值。后增量将 i 保留为 1doSomethingAx (0) 分配回 i,因此打印 0

第二。

i0 开始,并打印 0i++ 被评估。因为它是后递增,所以表达式值是旧值 0,因此这就是传递给 doSomethingB 的值。后增量将 i 保留为 1doSomethingBx (0) 添加到 i,因此 i 仍为 1,并打印 1

关于Java Postfix 增量运算符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19596983/

相关文章:

java - 最终的 java 应用程序的文件类型是什么?

java - ojAlgo:切片或提取子矩阵

java - OpenGL - 矩阵运算

java - 如何在 java jsch channelsftp setPermission(int permission, String path) 中设置 chmod 权限

javascript - 是什么 !! JavaScript 中的(不是不是)运算符?

java - 尝试使用适配器内的变量设置背景颜色时出现 StringIndexOutofBoundsException

swift - 我如何在 Swift 4 中测试具有关联值的枚举案例的等效性

c# - 编写一个不是容器的泛型类? [C#]

c++ - 运算符重载 'operator()'

c - 指针上多个增量运算符的求值顺序