【问题标题】:Pre/post increment/decrement and operator order confusion前/后递增/递减和操作员顺序混乱
【发布时间】:2014-06-17 03:42:16
【问题描述】:

我正在做一些练习,但我对此感到困惑:

public static int f (int x, int y) {
  int b=y--;
  while (b>0) {
    if (x%2!=0)  {
      --x;
      y=y-2; 
    }
    else { 
      x=x/2;
      b=b-x-1; 
    }
  }
  return x+y; 
} 

b=y-- 的目的是什么? 例如,x=5y=5 当我们第一次进入 while 循环 (while (b>0)) 时,b = 4 还是 5?当我在我的计算机上运行代码时b 是 5。返回是 3。我真的不清楚。抱歉,如果我的问题不清楚。

【问题讨论】:

  • 了解运算符优先级和前置/后置递增/递减运算符。
  • 在调试器中跟踪代码可能会很有帮助,因为您可以在每一步检查每个变量。

标签: java operators


【解决方案1】:

int b=y--; 首先分配b=y,然后递减 y (y--)。

还可以看看prefix/postfix unary increment operator

这个例子(取自链接页面)演示了它:

class PrePostDemo {
    public static void main(String[] args){
        int i = 3;
        i++;
        // prints 4
        System.out.println(i);
        ++i;               
        // prints 5
        System.out.println(i);
        // prints 6
        System.out.println(++i);
        // prints 6
        System.out.println(i++);
        // prints 7
        System.out.println(i);
    }
}

【讨论】:

  • 在分配 b 后将 y 减 1。
  • @La-comadreja 谢谢!固定。
【解决方案2】:

后递增/递减和前递增/递减之间的区别在于evaluation of the expression

预递增和预递减运算符将其操作数递增(或递减)1,表达式的值是结果递增(或递减)的值。相反,后自增和后自减运算符将其操作数的值增加(或减少)1,但表达式的值是操作数在增加(或减少)操作之前的原始值。

换句话说:

int a = 5;
int b;
b = --a;    // the value of the expression --a is a-1. b is now 4, as is a.
b = a--;    // the value of the expression a-- is a. b is still 4, but a is 3.

请记住,程序必须评估表达式才能完成所有操作。一切都是一种表达,即使只是随便提到一个变量。以下都是表达式:

  • a
  • a-1
  • --a && ++a
  • System.out.println(a)

当然,在评估表达式时,operator precedence 决定表达式的值,就像您在小学时学到的 PEMDAS 一样。一些操作符,比如自增/自减,有副作用,这当然很好玩,也是函数式编程诞生的原因之一。

【讨论】:

    【解决方案3】:

    我相信 b 会等于 5 进入循环,因为

    b=y--;
    

    当“--”在变量后面时,它会在操作后递减。

    【讨论】:

      【解决方案4】:

      这是一种糟糕的编码,因为它会使新程序员感到困惑。

      函数,假设它是按值传递,就像上面的例子一样(而不是按引用传递)获取y 的副本,递减它,并将其分配给b。它不会改变调用时传递给函数的参数。

      【讨论】:

      • 或者这可能是一个旨在迷惑新程序员的练习,让他们真正思考和理解前后递增/递减运算符?
      • +1,因为它的编码很差。是的,而且没有任何借口
      • @mbs 可能是真的。尽管从中吸取的唯一教训是;永远不要使用前缀。只能单独使用后缀
      • 我仍然认为,虽然它是不应该在实际程序中使用的糟糕的生产代码,但它可以用来指出怪癖或运算符优先级以及递增和递减运算符。
      • 除非它是 C++ 课程的一部分,并且学生正在学习按引用传递而不是按值传递、自动、静态和外部存储类修饰符等,否则代码是草率且不可原谅的用于学术和生产。
      【解决方案5】:

      后增量

      x++; 
      x += 1; 
      

      后递减

      x--; 
      x -=1; 
      

      预增量:++x;
      预减量:--x;

      根据 Head First Java:

      x++++x 之间的区别:

      int x = 0; int z = ++x; 
      Produces: x is 1, x is 1
      
      in x = 0; int z = x++; 
      Produces: x is 1, z is 0
      

      【讨论】:

        猜你喜欢
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多