首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >作为参数传递时,Java后增量(++)的行为不符合预期

作为参数传递时,Java后增量(++)的行为不符合预期
EN

Stack Overflow用户
提问于 2012-10-12 21:24:57
回答 3查看 7.5K关注 0票数 6

我遇到了以下问题:

代码语言:javascript
运行
复制
private void doStuff(int i) {
   if(i>10) {
      return;
   }
   doStuff(i++); 
}

public void publicMethod() {
   doStuff(i);
}

我希望这段代码会运行doStuff 10次,然后返回。

但是,在使用0再次调用doStuff之前,不会执行i++

结果是一个无限循环。我知道如何修复它,但我想知道这个行为是正确的还是错误的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-12 21:26:46

现在,我希望这个函数运行doStuff 10次,然后返回,但是在doStuff被再次调用之前,i++不会被执行。

是的,后增量运算符的结果是原始值...然后在下一次调用该方法时,您就有了一个新的i。换句话说,这个调用:

代码语言:javascript
运行
复制
doStuff(i++); 

等同于:

代码语言:javascript
运行
复制
int original = i;
i = original + 1;
doStuff(original);

来自JLS section 15.14.2

后缀增量表达式的值是存储新值之前的变量值。

既然你以后不再使用i (因此它的任何副作用都是毫无意义的),为什么不简单地简化你的生活呢?

代码语言:javascript
运行
复制
doStuff(i + 1);

(与Java语言中的所有参数一样,您看到的是按值传递-更改方法中i的值不会更改调用方参数的值。)

票数 20
EN

Stack Overflow用户

发布于 2012-10-12 21:26:24

++操作符的工作与预期不谋而合。它首先返回变量的值,然后增加变量,因此总是传递0。

这一点:

代码语言:javascript
运行
复制
doStuff(i++);

是这样的:

代码语言:javascript
运行
复制
int x = i;
i += 1;
doStuff(x);
票数 2
EN

Stack Overflow用户

发布于 2012-10-12 21:26:45

i++的意思是:“使用i的值,然后递增它”。向下传递时,它将始终为零。它是值类型,而不是引用类型。如果这是一个对象,那就没问题了,因为它会被当作引用来处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12860070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档