10

我刚刚了解到,如果一个return语句包含一个自增操作,return会先执行,值会在自增之前返回。如果我首先在单独的语句中递增,然后返回,它会按预期工作。

private static int incrementIntV1(int a)
{
   return a++;
}

private static int incrementIntV2(int a)
{
    a++;
    return a;
}

public static void main(String[] args)
{
    int b = 6;

    System.out.println("Increment in return: " + incrementIntV1(b));
    System.out.println("Increment first, then return: " + incrementIntV2(b));
    System.out.println("Increment with addZero: " + incrementAddZero(b));
}   

return 发生了什么使得它有时评估整个表达式,有时不评估?这是关于增量操作如何发生的特别之处吗?

如果我尝试:

private static int incrementAddZero(int a)
{
    return a++ + addZero();
}

private static int addZero()
{
    System.out.print("addZero executes");
    return 0;
}

增量操作仍然没有发生,但我知道 addZero 方法由于 print 语句而运行。为什么它在 return 之前不递增,但它在 return 之前执行 addZero 方法?

希望他说得通。非常感谢。

4

2 回答 2

9

您遇到的行为与 return 语句无关。这是后增量运算符的行为。表达式a++递增a但返回 的前一个值a

return a++;

相当于:

int x = a++;
return x;

类似的,

return a++ + addZero();

相当于:

int x = a++ + addZero();
return x;

或者 :

int x = a++;
return x + addZero();

a++返回a增加之前的值。

return 发生了什么使得它有时评估整个表达式,有时不评估?

return总是对返回的整个表达式求值(除非 return 语句包含一些短路运算符,例如&&and ||,但这里不是这种情况),但后自增运算符的a++求值返回a.

于 2016-01-08T14:13:06.447 回答
2

来自java 文档

唯一的区别是前缀版本 (++result) 计算为增量值,而后缀版本 (result++) 计算为原始值。如果您只是执行简单的递增/递减,那么您选择哪个版本并不重要。但是,如果您在较大表达式的一部分中使用此运算符,则您选择的那个可能会产生显着差异。

于 2016-01-08T14:15:51.483 回答