==
.equals()
int var = 0;
var++;
以及
int var = 0;
++var;
这会对for循环产生什么影响?例如。
for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
==
.equals()
int var = 0;
var++;
以及
int var = 0;
++var;
这会对for循环产生什么影响?for (int i = 0; i < 10; i++) {}
for (int i = 0; i < 10; ++i) {}
var++
和++var
都可以将变量递增,但var++
返回的是递增前的值,而++var
返回的是递增后的值。
当++var
或var++
作为完整语句出现(就像在你的例子中一样),两者之间没有区别。例如:
int x = 6;
++x;
assert x == 7;
等同于
int x = 6;
x++;
assert x == 7;
然而,当++var
或var++
作为一个较大语句的一部分时,这两者可能不等价。例如,以下断言通过。int x = 6;
assert ++x == 7;
而这一个失败了
int x = 6;
assert x++ == 7;
尽管var++
和++var
都会对应用它们的变量进行递增,但var++
返回的结果是在递增之前的变量值,而++var
返回的结果是在递增被应用后的变量值。当在for
循环中使用时,两者没有区别,因为变量的递增不构成更大语句的一部分。尽管源文件的同一行上有其他代码,这可能看起来不是这样。但是如果您仔细观察,就会发现在递增之前立即有一个;
,之后没有任何内容,因此递增运算符不构成更大语句的一部分。int a = 5, b;
后置递增: b = a++;
: 首先将a
的值赋给b
,然后a
递增1,现在b
是5
,而a
是6
。效果等同于b = a; a = a + 1;
前置递增: b = ++a;
: 首先将a
递增1,然后将结果赋给b
,因此现在a
和b
都是7
。效果等同于a = a + 1; b = a
a++
和++a
在作用上类似。在您提供的循环示例中,递增运算符未与任何表达式相关联,它们是独立的。因此,在这个特定的实现中,这两者是相同的。
++var
是前缀自增运算符,它在计算表达式之前将 var
的值加 1。类似地,var++
是后缀自增运算符,它在计算表达式之后将 var
的值加 1。
对于简单的循环而言,这两种方式没有区别,因为表达式 ++var;
和 var++;
都会得到相同的结果。
如需更多信息,请参见例如http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html#IncDecOps。
var ++ 返回其增加前的值。
++ var 返回其增加后的值。
int var = 0;
System.out.println(var++); // returns 0;
var = 0;
System.out.println(++var); // returns 1
int var = 0;
int var2 = ++var;
并且:
int var = 0;
int var2 = var++;
++var
和 var++
在单独出现在表达式中时是相同的。这适用于你的问题,因为你只有++i
,i++
它们之间的不同仅在于当你将它们内联时:
int x = 0;
printf( "%d %d\n", ++x, x ); // 1 1
printf( "%d %d\n", x++, x ); // 1 2
如何记忆?
当您看到先操作符,然后增量,然后再获取值时。
当您看到先变量,然后获取值,然后再增量时。
因此,在第一个示例中,您看到相等的值,因为:
you increment `x`, then access `x`, then access `x` again
you access `x`, then increment `x`, then access `x` again
j = ++i +1;
等同于
i = i+1;
j = i+1;
而后增量 i++ 是在结尾执行的;
j = i++ +1;
等同于
j = i+1;
i = i+1;
++i是前增量,它会在表达式中出现的任何内容之前执行。
i++是后减量,它会在表达式中出现的任何内容之后执行。
在第一个循环中,您将从0到9运行。在第二个循环中,它将从1到9运行。
我的建议:避免使用它们(例外情况可能是i++;或第一个循环)。在表达式中太棘手了。
我花了一整天时间进行调试
myArray[(i++)%16] = data
并试图找出为什么有时它会尝试写入data[16]
data[16]
? - Tom Shaw