++Var和Var++的区别

116
在编程中,特别是在Java中,以下两种方式有何区别:
  • ==
  • .equals()
int var = 0;
var++;

以及

int var = 0;
++var;
这会对for循环产生什么影响?
例如。
for (int i = 0; i < 10; i++) {}

for (int i = 0; i < 10; ++i) {}

https://dev59.com/LXRB5IYBdhLWcg3w3K8J - Paul Tomblin
5
为什么会有人踩这个问题?!看看这个问题已经引起了多少混乱! - user559142
9
这不是重复的问题。我询问关于for循环的内容。 - user559142
4
我也发布了其他几个链接,这些链接也是如此。 - Paul Tomblin
2
实际上只有一个,这与本帖中提供的答案相矛盾... - user559142
显示剩余2条评论
8个回答

176

简述

var++++var都可以将变量递增,但var++返回的是递增前的值,而++var返回的是递增后的值。

详细解释

++varvar++作为完整语句出现(就像在你的例子中一样),两者之间没有区别。例如:

int x = 6;
++x;
assert x == 7;

等同于

int x = 6;
x++;
assert x == 7;
然而,当++varvar++作为一个较大语句的一部分时,这两者可能不等价。例如,以下断言通过。
int x = 6;
assert ++x == 7;

而这一个失败了

int x = 6;
assert x++ == 7;
尽管var++++var都会对应用它们的变量进行递增,但var++返回的结果是在递增之前的变量值,而++var返回的结果是在递增被应用后的变量值。当在for循环中使用时,两者没有区别,因为变量的递增不构成更大语句的一部分。尽管源文件的同一行上有其他代码,这可能看起来不是这样。但是如果您仔细观察,就会发现在递增之前立即有一个;,之后没有任何内容,因此递增运算符不构成更大语句的一部分。

3
在循环中怎么办? - user559142

18

int a = 5, b;

后置递增: b = a++; : 首先将a的值赋给b,然后a递增1,现在b5,而a6。效果等同于b = a; a = a + 1;

前置递增: b = ++a; : 首先将a递增1,然后将结果赋给b,因此现在ab都是7。效果等同于a = a + 1; b = a

a++++a在作用上类似。在您提供的循环示例中,递增运算符未与任何表达式相关联,它们是独立的。因此,在这个特定的实现中,这两者是相同的。


15

13

var ++ 返回其增加前的值。
++ var 返回其增加后的值。

int var = 0;
System.out.println(var++); // returns 0;

var = 0;
System.out.println(++var); // returns 1

7
在您的示例中,没有区别,但是在以下情况下有区别:
int var = 0;
int var2 = ++var;

并且:

int var = 0;
int var2 = var++;

在第一种情况下,var2的值为1,而在第二种情况下,它是0。

1

++varvar++ 在单独出现在表达式中时是相同的。这适用于你的问题,因为你只有++ii++

它们之间的不同仅在于当你将它们内联时:

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

0
事实上,这很简单。在语句中,预增量 ++i 首先被执行。
j = ++i +1;

等同于

i = i+1;
j = i+1;

而后增量 i++ 是在结尾执行的;

j = i++ +1;

等同于

j = i+1;
i = i+1;

在“j = i++ +1”中,递增操作不会在末尾执行。加法仍然是最后执行的(在赋值之前)。i++返回的值是递增之前的i的值;与++i相反,它返回递增之后的值。 - user85421

0

++i是前增量,它会在表达式中出现的任何内容之前执行。

i++是后减量,它会在表达式中出现的任何内容之后执行。

在第一个循环中,您将从0到9运行。在第二个循环中,它将从1到9运行。

我的建议:避免使用它们(例外情况可能是i++;或第一个循环)。在表达式中太棘手了。

我花了一整天时间进行调试

myArray[(i++)%16] = data

并试图找出为什么有时它会尝试写入data[16]


1
那段代码片段为什么会尝试写入 data[16] - Tom Shaw
好的,我的失败...它确实以i == 16结束,但在那个点上它写入了data[15],错误发生在后来,因为我认为i < 16(因为我把i++放在括号里)。这段代码是十年前写的,所以我不记得它崩溃的确切方式。我清楚地记得寻找它花费的时间以及我坚定的决心再也不在表达式中使用i++或++i。 - SJuan76
完全不正确!后自增在表达式中的任何位置都不会执行,实际上它是所有运算符中优先级最高的,也就是说,它首先被执行:运算符 这只是增量返回的值有所不同:增加之前的值还是增加之后的值。同时,这两个循环的功能完全相同;它们编译成了相同的字节码! - user85421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接