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

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

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

我遇到了以下问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 13:26:46

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doStuff(i++); 

等同于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int original = i;
i = original + 1;
doStuff(original);

来自JLS section 15.14.2

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doStuff(i + 1);

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

票数 20
EN

Stack Overflow用户

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

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

这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
doStuff(i++);

是这样的:

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

Stack Overflow用户

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

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

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

https://stackoverflow.com/questions/12860070

复制
相关文章
窗体显示
这个是可以点击的 主要是没有那个事件绑定所以没有啥事只有点击之后啥都没有啦 我每一部分都用的一个主程序 所以看着会比较乱但是不影响复习 源代码奉上
用户8447427
2022/08/18
1.4K0
窗体显示
事件_窗体传值
本实项目创建步骤记录: 1、创建两个Webform窗体 2、实现功能::在form1窗体中点击按钮---->将文本框中的值传递到,From2中文本框中。 3、用事件来实现;跟据以前学的知识,知道,事件的核心其实就是委托; 1)、在Form1中声明一个无返回值类型void的委托 Mydel public delegate void Mydel(); 2)、在单击事件方法前声明一个 委托字段 public event Mydel _mdl; 4、事件定义完毕! 5、单击按钮后,显示窗体Form2,同时对这个按钮注册一个事件 1)、this._mdl += 输入完毕后,, 通常是点击 Tab键进行事件的补全;; 这里不需要。。这里 使用的是new Mydel( );方便在这里进行传递方法名字f2.SetTxt; 2)、怎么样将一种的值传递过道Form2中 3)、假设这里有一方法 SetTxt() 就是存在Form2这个类中。。就是用来改变Form2文本 框中的内容的。 4)、其实这个方法SetTxt()就是存在,Form2中的。。那么,这就需要手动的写这个方法 在Form2类中。 5)、这个SetTxt()方法是通过Form1中的事件来调用方法名字(f2.SetTxt)。也可以说是 委托来调用的,,。。。。 6)、使用事件也是需要判断是否为null的,, if(this._mdl!=null) { this._mdl(); //不为null就调用。。。简记:说是调用,就是在mdl后边加上一对 () } 7)、当你写方法f2.SetTxt的时候,有错误。。为什么呢?因为你定义的委托Mydel中没有参 数。但是你这里用了参数 "f2.SetTxt" this._mdl+=new Mydel(f2.SetTxt); 8)、所以返回委托定义的地方,添加上 参数 string name 9)、F6生成成功的! 6、如何传值呢? 7、可以把Text.Box1.Text作为参数放到this._mdl() if(this._mdl!=null) { this._mdl(Text.Box1.Text); //就是对f2.SetTxt()赋值了 } 8、此时报错了。为什么,因为在Form2中的方法SetTxt()并没有声明参数,所以要对Form2中的方法 。进行SetTxt()的变量申明一个字符串的变量; public void SetTxt(string name); 9、接着,在Form2这个public void SetTxt(string name);方法下进行函数功能的实现 public void SetTxt(string name) { textBox1.Text=name; }
静心物语313
2020/03/24
1.1K0
[C#] winform 子窗体向父窗体传值
父窗框mainForm;子窗体childForm,利用事件进行传值 在子窗体中的操作:
静默虚空
2022/05/07
2.2K0
事件_窗体传值(使用系统自带的委托)
本实验的目的:利用系统自带的EventHandler 委托。模仿.netFrame系统的委托是如何实现功能的;
静心物语313
2020/03/24
6310
winform中使用委托进行窗体之间的传值
一、传统的方式 创建一个公共数据资源类,用于存储窗体2的TextBox的值: public class ComValue { public static string Txtvalue { get; set; } } 窗体1的代码: private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2();
指尖改变世界
2018/08/31
2.1K0
winform中使用委托进行窗体之间的传值
设置WPF窗体全屏显示:
//全屏代码: private void Window_Loaded(object sender, RoutedEventArgs e) { // 设置全屏 this.WindowState = System.Windows.WindowState.Normal; this.WindowStyle = System.Windows.WindowStyle.None; this.ResizeMode = System.Windows.ResizeMode.NoResize;
hbbliyong
2018/03/05
3.9K0
ModalPopupExtender用法示例
aspx页面 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Test_Default" %> <%@ Register assembly="AjaxControlToolkit" namespace="AjaxControlToolkit" tagprefix="cc1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit
菩提树下的杨过
2018/01/22
6580
iframe怎么将参数传递给vue 父组件
在子页面的iframe中想将参数传递给Vue父组件,可以使用postMessage()方法将数据发送给父窗口。父组件可以通过监听message事件来接收并处理这些数据。
王小婷
2023/08/10
1.4K0
rsyslog将日志记录于MySQL中并web显示
rsyslog将日志记录于MySQL中 ABC三台机器 A web显示 B 建数据库 C 日志文件 按编号顺序执行 B机器 (1) 准备MySQL Server 并启动 yum install mariadb-server (3) 为rsyslog创建数据库及表; [root@centos7 ~]#mysql >createDB.sql 或者 [root@centos7 ~]#mysql MariaDB [(none)]> source createDB.sql (4) 授权
咻一咻
2020/05/29
1.4K0
用户窗体示例:工作表数据与用户窗体的交互
好的网站是非常优秀的学习资源,认真研究其分享的知识是我们快速提高水平的方法之一。这个示例仍然来自于thesmallman.com,演示了用户窗体如何与工作表中的数据进行交互:如何使用Excel工作表中的数据填充用户窗体,并将编辑后的数据发送回工作表;并且在这个例中,只需在用户窗体中输入一个关键字,然后单击回车键将自动填充用户窗体。
fanjy
2022/11/16
1.4K0
用户窗体示例:工作表数据与用户窗体的交互
golang版本sdl2显示窗体
go用syscall调用sdl2,在win10 x64上没问题,其他系统不敢保证。
福大大架构师每日一题
2023/06/08
2840
golang版本sdl2显示窗体
将多个属性传递给 Vue 组件的几种方式
所有使用基于组件的体系结构(如Vue和React)的开发人员都知道,创建可重用组件是很困难的,而且大多数情况下,最终会通过传入大量的属性,以便从外部更容易地控制和自定义组件。这并不坏,但是传递大量属性确实会变得有点麻烦和丑陋。
前端小智@大迁世界
2020/05/11
1.9K0
如何在Linux中使用管道将命令的输出传递给其他命令?
在Linux中,管道使用竖线符号 | 表示,它位于两个命令之间。管道的基本语法如下:
网络技术联盟站
2023/09/06
1.5K0
如何在Linux中使用管道将命令的输出传递给其他命令?
如何在Linux中使用管道将命令的输出传递给其他命令?
在Linux系统中,管道(Pipeline)是一种强大的工具,它允许将一个命令的输出作为另一个命令的输入。通过管道,我们可以将多个命令串联在一起,实现数据的流动和处理。本文将详细介绍如何在Linux中使用管道将命令的输出传递给其他命令,并提供一些常见的使用示例。
网络技术联盟站
2023/06/14
1.4K0
如何在Linux中使用管道将命令的输出传递给其他命令?
C#将子窗体填充到父窗体的panel中
这里此窗体为lvlv_CauseForm 窗体,new一个窗体对象cf后,进行填充,代码如下:
恋喵大鲤鱼
2018/08/03
3.2K0
golang版本sdl2显示窗体
go用syscall调用sdl2,在win10 x64上没问题,其他系统不敢保证。
福大大架构师每日一题
2022/06/14
6570
golang版本sdl2显示窗体
Serilog高级玩法之用Serilog记录所选终结点附加属性
这是该系列的第二篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore。
依乐祝
2020/02/14
1.7K0
Serilog高级玩法之用Serilog记录所选终结点附加属性
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.7K0
winfrom向窗体中拖放图片并显示
首先要设置窗体的AllowDrop属性为true。然后在窗体的DragEnter事件中添加如下代码:调用自定义的显示图片的方法。
跟着阿笨一起玩NET
2018/09/19
9290
C# WPF MVVM模式下在主窗体显示子窗体并获取结果
在winform中打开一个新的子窗体很简单,直接实例化窗体并show一下就可以:
用户9127601
2021/11/01
1.8K0

相似问题

如何使用所选记录打开窗体?

11

将所选记录id传递给href

22

将Python对象传递给C,然后再回传

10

显示所选记录

30

ASP.NET将函数返回值从modalpopupextender传递给主窗体

13
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文