Java 前后递增/递减和操作员顺序混淆
我正在做一些练习,但我对这个感到困惑:Java 前后递增/递减和操作员顺序混淆,java,operators,Java,Operators,我正在做一些练习,但我对这个感到困惑: 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=5和y=5 当我们第一次进入while循环(w
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=5
和y=5
当我们第一次进入while循环(while(b>0)
)时,b
=4或5?当我在计算机中运行代码时b
为5。回报率是3。我真的不清楚。如果我的问题不清楚,很抱歉。intb=y--代码>首先分配b=y
,然后递减y
(y--
)
还可以看一看
此示例(取自链接页面)演示了:
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);
}
}
intb=y--代码>首先分配b=y
,然后递减y
(y--
)
还可以看一看
此示例(取自链接页面)演示了:
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等于5进入循环,因为
b=y--;
当“-”在变量后面时,它会在动作后递减。我相信b等于5进入循环,因为
b=y--;
当“-”在变量后面时,它会在操作后将其递减。这是糟糕的编码,因为它会让新程序员感到困惑
该函数假定它是按值传递的,如上面的示例(与按引用传递相反),获取y
的一个副本,将其递减,并将其分配给b
。它不会改变调用函数时传递给函数的参数。这是糟糕的编码,因为它会让新程序员感到困惑
该函数假定它是按值传递的,如上面的示例(与按引用传递相反),获取y
的一个副本,将其递减,并将其分配给b
。它不会改变调用函数时传递给函数的参数。后增量/减量和前增量/减量之间的差异在中
预递增运算符和预递减运算符将其操作数递增(或递减)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)
当然,在表达式的评估中,正如你在小学时所学的那样,口述表达式的值。有些操作符,如递增/递减,会产生副作用,这当然很有趣,也是创建函数式编程的原因之一。递增/递减后和递增/递减前的区别在于
预递增运算符和预递减运算符将其操作数递增(或递减)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)
当然,在表达式的评估中,正如你在小学时所学的那样,口述表达式的值。有些操作符,如递增/递减,会产生副作用,这当然很有趣,也是创建函数式编程的原因之一。Post increment
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
增量后
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
分配b后,y递减1。@La comadreja谢谢!修正了。在分配了b之后,y递减1。@La comadreja谢谢!修复。了解运算符优先级和递增/递减前/后运算符。在调试器中跟踪代码可能非常有用,因为您可以在每个步骤上检查每个变量。了解运算符优先级和递增/递减前/后运算符。在调试器中跟踪代码可能非常有用,你可以在每一个步骤中检查每个变量。或者,这是一个旨在迷惑新程序员的练习,让他们真正思考和理解递增/递减前后运算符?+1的糟糕编码。是的,没有任何借口it@mbs可能是真的。尽管从中得到的唯一教训是;永远不要使用前缀。只使用它的后缀,我仍然认为,虽然它是一个不应该在实际程序中使用的可怜的生产代码,但它有一个用于指出怪癖或操作员优先级和递增和递减操作符的用法,除非它是C++类的一部分,而且学生学习通过引用的方式与通过值传递相比,自动vs静态vs外部存储类修饰符,等等,这些代码对于学术界和生产部门来说是草率和不可原谅的。或者,这是一个旨在迷惑新程序员的练习,让他们真正思考和理解