当前位置: 首页 > 面试题库 >

后和前增量运算符

潘泰
2023-03-14
问题内容

当我运行以下示例时,我得到输出0,2,1

class ZiggyTest2{

        static int f1(int i) {  
            System.out.print(i + ",");  
            return 0;  
        }

        public static void main(String[] args) {  
            int i = 0;  
            int j = 0;  
            j = i++;   //After this statement j=0 i=1
            j = j + f1(j);  //After this statement j=0 i=1
            i = i++ + f1(i);  //i++ means i is now 2. The call f1(2) prints 2 but returns 0 so i=2 and j=0
            System.out.println(i);  //prints 2?
        } 
    }

我不明白为什么输出是0,2,1而不是0,2,2


问题答案:
 i = i++ + f1(i);

i++意思i是现在2。调用f1(i)打印2,但返回0,所以i=2j=0

在此之前i = 1,现在想象f1()被调用并替换为0

所以

i = i++ + 0;

现在它将是

i = 1 + 0 // then it will increment i to 2 and then (1 +0) would be assigned back to `i`

用简单的话(从这里 @ Piotr)

“ i = i ++”大致翻译为

int oldValue = i; 
i = i + 1;
i = oldValue;

另一个这样的例子:

  • 同样的基本原理


 类似资料:
  • 问题内容: 免责声明: 这不是真实示例。这只是这些语言如何工作的理论问题。 C / C ++,C#和Java在后和前增量运算符之间到底有什么区别? 这就是我使用VC ++ 10,Java 1.6和C#4所获得的 问题答案: Java和C#从左到右评估表达式,其副作用立即可见。 在C ++中,未指定子表达式的求值顺序,并且两次修改同一对象而没有插入顺序点的行为是未定义的行为。

  • 问题内容: 我正在做一些有关Java的研究,发现这很令人困惑: 这是永无止境的循环! 有人很好地解释了为什么会发生这种事情吗? 问题答案: 上面的循环与以下内容基本相同:- 3 次你的一部分声明- ,被评估为: - 您需要从此处删除分配,以使其起作用:- (根据评论的OP请求) 的行为:- 就注释中指定的问题而言,以下表达式的结果:- 获得如下:- 让我们标记第二条语句的不同部分:- 现在,首先将

  • 问题内容: 我对post 和pre 运算符感到困惑,例如以下代码 会打印10吗? 它打印10,但我希望它应该打印11 但是当我这样做 它会按照我的预期输出11,所以为什么x = x ++; 不会改变x的值? 问题答案: 否,正确的打印输出为10。理解结果背后原因的关键是预分配和后分配复合分配之间的差异。当使用预增量时,表达式的值在执行增量后获取。但是,当您使用后递增时,表达式的值 在 递增 之前

  • AWK支持以下递增和递减运算符 - Pre-Increment 它由++表示。 它将操作数的值递增1 。 此运算符首先递增操作数的值,然后返回递增的值。 例如,在以下示例中,此运算符将操作数a和b的值设置为11。 例子 (Example) awk 'BEGIN { a = 10; b = ++a; printf "a = %d, b = %d\n", a, b }' 执行此代码时,您将获得以下结

  • 增量运算符++将1添加到其操作数,减量运算符 - 从其操作数中减去1。 因此 - x = x+1; is the same as x++; 同样 - x = x-1; is the same as x--; 递增和递减运算符都可以在操作数之前(前缀)或后跟(后缀)。 例如 - x = x+1; can be written as ++x; // prefix form 或者 - x++; /