Java中n++和++n的区别

6

我的Java老师说使用++n比n++更好,但我不明白其中的逻辑。有人知道吗?


3
我相信他可能说过在特定情境下最好使用++n。 - George Johnston
Java、C、C++、PHP 等编程语言 - Joe
2
Java中的X和X之间有区别吗? - Zach L
也许你的老师甚至不知道为什么。在我居住的地方,许多“编程老师”一窍不通。 - adrianboimvaser
1
了解它们之间的区别很重要,它们都有各自的用途。但是,其中一个并不比另一个更好。它们只是不同的工具。 - rfeak
8个回答

26

++n递增变量并返回新值。

n++递增变量并返回旧的值。

因此,n++需要额外的存储空间,因为它必须跟踪旧值,以便在递增完成后返回。

我预计这两者之间的实际差异现在可以忽略不计了。我知道许多编译器会优化它们,如果没有实际使用n++的返回值,则它们将相同,但我不知道Java是否这样做。


很好的解释!在旧的日子里,如果n是一个大对象并实现了++运算符,这将变得非常重要。 - trillions
所以,n++ 毫无疑问是绝对行业标准的原因是什么?就像没有人使用 ++n 一样,除非代码强制要求。 - Jonathon
我不认为这是正确的。在过去的许多年里,我看到的大部分代码都使用++n,除非他们明确需要n++的行为。 - Herms

5
你的Java老师(可能)是指前自增比后自增通常稍微快一点。我甚至不确定在Java中是否如此,因为我是在C课程中学到这个的。

"我们应该忘记小的效率问题,大约97%的时间:过早的优化是万恶之源"

唐纳德·克努斯

在日常实践中,我会根据代码中最有意义的内容使用前自增或后自增。

4

n++将在操作发生之前递增变量,而++n仅在操作后递增变量。

So take x = 1
        y = x++
        y = 1
        x = 2 now

So take x = 1 again
        y = ++x
        y = 2
        x = 2 now

我认为你的意思是 x = 1; y = x++; (y == 1 && x == 2) 评估为真,x = 1; y = ++x; (y == 2 && x == 2) 评估为真。 - Nathan C. Tresch
@Bnjmn,我认为你在书面解释中把n++和++n搞反了,但你的代码示例是正确的。 - Inertial Ignorance

4

例子:

int n = 10;
int a = n++; // a is 10
int b = n; // b is 11
int c = ++n; // c is 12

区别在于++n的值是n + 1,而n++的值是n

两者都可以实现相同的功能,没有更好的一种。在程序中不应该依赖这两者的差异,因为1.) 相当多的人不理解它们的区别,2.) 同样的事情可以更简单地完成。


1
那些不理解这个差异的人应该被禁止阅读任何代码。 :) - Mchl

2

它们做不同的事情。

假设n = 10。那么n++会增加n的值,但返回10。

++n会增加n的值,并返回11。

虽然我不确定哪一个需要更多的汇编指令。


看起来 Herms 和 Mchl 已经为我回答了那个问题 - 谢谢。 - ktm5124

1
Both increment and decrement operators have two forms which are very important when using the result in the current statement:
- prefix (++n or --n) increases/decreases the value of a variable before it is used; - postfix (n++ or n--) increases/decreases the value of a variable after it is used.
Let's take an example:
- Prefix Increment:
int a = 4;
int b = ++a;
System.out.println(a); // 5
System.out.println(b); // 5
  • Postfix Increment
int a = 4;
int b = a++;
System.out.println(a); // 5
System.out.println(b); // 4

0

一个有趣的例子可以说明它们之间的区别:

public class Main {
    public static void main(String[] args) {
        for (int i=0; i<5; /*not incrementing here*/ ) 
            System.out.println(i++);
    }
}

输出: 0 1 2 3 4

public class Main {
    public static void main(String[] args) {
        for (int i=0; i<5; /*not incrementing here*/ ) 
            System.out.println(++i);
    }
}

输出: 1 2 3 4 5

请注意,由于这里并不重要,因此两个for循环都没有执行递增操作。


0

++n会先将n加1,然后使用它; n++会先使用它,然后再加1。 --同理。


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