- 浏览: 25967 次
- 性别:
- 来自: 成都
文章分类
最新评论
i++是在一个先使用后加1,即先使用i的值,后让i+1
++i则是先加1后使用,即先让i+1后再使用i的新值
class ijiajia{
public static void main(String[] args) {
System.out.println("Hello World!");
int i=3; int count=(i++)+(i++)+(i++);//count=3+4+5,不信的话你可以用count=(i++)+(i++);这时会等于7
System.out.println(i);//i=6
System.out.println(count);//count=12
int j=3; count=(++j)+(++j)+(++j);//count=4+5+6
System.out.println(j);//j=6
System.out.println(count);//count=15
}
}
int i=0;
i=i++;
结果i是多少?
这是一个经常被提及的问题,答案一直五花八门。
具体测试一下以说明问题:
代码1:
public class Test{
public static void main(String[] args){
int i=0;
i=i++;
System.out.println(i);
}
}
结果i依然是0.分析其反编译后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0 //0放到栈顶
1: istore_1 //把栈顶的值保存到局部变量1,也就是i中
2: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1 //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1 //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0
代码2:
public class Test2{
public static void main(String[] args){
int i=0;
int j=0;
j=i++;
System.out.println(i);
System.out.println(j);
}
}
这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //i=0
2: iconst_0
3: istore_2 //j=0 4: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
5: iinc 1, 1 //局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化
8: istore_2 //把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
很明显可以看出,java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。
代码3:
public class Test3{
public static void main(String[] args){
int i=0;
int j=0;
j=++i;
System.out.println(i);
System.out.println(j);
}
}
结果大家也都知道,i=1,j=1
看操作过程:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //i=0
2: iconst_0
3: istore_2 //j=0
4: iinc 1, 1 //局部变量i加1,这时候i变成1了 。
7: iload_1 //把i的值放到栈顶,栈顶的值是1
8: istore_2 //j=1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
对比代码2和代码3,关键的差别就是iload_1 个iinc这两条指令的位置变了。
++i则是先加1后使用,即先让i+1后再使用i的新值
class ijiajia{
public static void main(String[] args) {
System.out.println("Hello World!");
int i=3; int count=(i++)+(i++)+(i++);//count=3+4+5,不信的话你可以用count=(i++)+(i++);这时会等于7
System.out.println(i);//i=6
System.out.println(count);//count=12
int j=3; count=(++j)+(++j)+(++j);//count=4+5+6
System.out.println(j);//j=6
System.out.println(count);//count=15
}
}
int i=0;
i=i++;
结果i是多少?
这是一个经常被提及的问题,答案一直五花八门。
具体测试一下以说明问题:
代码1:
public class Test{
public static void main(String[] args){
int i=0;
i=i++;
System.out.println(i);
}
}
结果i依然是0.分析其反编译后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0 //0放到栈顶
1: istore_1 //把栈顶的值保存到局部变量1,也就是i中
2: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1 //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1 //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
值得注意到是i被修改了两次,第一次是i++;i变为1,最后一次是i=0;所以结果i是0
代码2:
public class Test2{
public static void main(String[] args){
int i=0;
int j=0;
j=i++;
System.out.println(i);
System.out.println(j);
}
}
这个结果肯定都知道,i是1,j是0.同样看反编译之后的代码:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //i=0
2: iconst_0
3: istore_2 //j=0 4: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
5: iinc 1, 1 //局部变量1加1,也就是让i++了,此时i已经是1了,上面说过,此指令不会导致栈变化
8: istore_2 //把栈顶的值(注意是0)存入局部变量2,也就是j中,所以j=0
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
很明显可以看出,java是先把i的值取出来放到栈顶,我们可以认为是引入了第三个变量int k=i;然后i++,这时候i为1了,然后让j=k;也就是0.结论,i的++运算是在对j这个变量的赋值之前完成的。
代码3:
public class Test3{
public static void main(String[] args){
int i=0;
int j=0;
j=++i;
System.out.println(i);
System.out.println(j);
}
}
结果大家也都知道,i=1,j=1
看操作过程:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1 //i=0
2: iconst_0
3: istore_2 //j=0
4: iinc 1, 1 //局部变量i加1,这时候i变成1了 。
7: iload_1 //把i的值放到栈顶,栈顶的值是1
8: istore_2 //j=1
9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
16: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
19: iload_2
20: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
23: return
对比代码2和代码3,关键的差别就是iload_1 个iinc这两条指令的位置变了。
发表评论
-
java复制文件高效处理方式
2014-12-18 21:44 13231.实现输出读取文件内容的示列(不推荐使用低效): @T ... -
java中反射:反射的应用--取得类的结构(三)
2014-10-23 14:39 487通过反射的到一个类的完整结构,那么这就要使用到 java.l ... -
java中反射:Class类的使用(二)
2014-10-23 14:33 424通过无参构造实例化对象: 如果想要通过Class类本身实例化 ... -
java中反射:认识Class类(一)
2014-10-21 11:33 501认识Class类: 在正常 ... -
java 批量测试访问谷歌IP
2014-10-21 11:22 483导入jar:log4j-1.2.17.jar,slf4j-ap ... -
java中的Annotation(注解)
2014-10-11 11:42 410Annotation(注释) 概述 从 JDK 5.0 开始, ... -
java 乱码转码类
2014-10-10 21:15 453import java.io.UnsupportedEncod ... -
java中的泛型
2014-10-09 21:57 3881. 介绍 下面是那种典型用法: ... -
java中的面向对象
2014-10-09 21:24 456理解面向对象的概念 面向过程 在一个结构体中定义窗 ... -
Java异常
2014-10-09 20:51 298任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除 ... -
java中3种注释
2014-10-09 08:49 6771、单行注释:在注释内容前加双斜线(//),java编译器会忽 ... -
java中length与length(),size()区别
2014-10-08 17:11 10601、length:在数组操作中,使用length取得数组的长度 ... -
java 多线程有几种现实方式
2014-10-08 16:55 563(1)继承Thread类,重写run函数 创建: cl ... -
java中string与int类型互相转换
2014-10-08 16:51 4251如何将字串 String 转换成整数 int? ... -
Java中16种主流数据库的jdbc连接字符串
2014-10-08 16:39 3761. Microsoft SQLServer(http://w ... -
字符串转换成整数 “456”转换456
2013-06-06 17:11 445http://blog.csdn.net/u010905938 ...
相关推荐
浅谈c i++与java i++的区别 在编程语言中,increment运算符(++)是一个非常常用的操作符,它可以将变量的值增加1。但是,c语言和java语言在使用increment运算符时存在着一些区别,这篇文章将深入探讨c语言和java...
在eclipse中运行如下代码,很多小伙伴在纠结到底应该是多少,其实正确结果应该是0!!! int i = 0; i = i++; System.out.println("i的值是 : " + i); 这是和JVM的内存分配有关,JVM在处理这段带代码时,会先把i++的...
在Java编程语言中,`i=i++`是一个典型的自增表达式,它的行为可能会引起一些混淆,特别是当对比于其他编程语言如C或C++时。这个表达式在Java中的行为可以通过反编译成Java虚拟机(JVM)指令来理解。 首先,让我们...
### Java中的自增运算符与循环控制 在Java编程语言中,`for`循环是一种常用的迭代结构,用于重复执行一段代码直到满足特定条件为止。在本文中,我们将深入探讨一个有趣的`for`循环示例,并解释为什么该示例会导致一...
Java中i++与++i的区别和使用 Java 中的 i++ 和 ++i 是两个常用的操作符,它们都是对变量进行加 1 或减 1 的操作,但是它们的执行顺序和结果却有着很大的区别。 首先,让我们来了解一下 i++ 和 ++i 的定义。i++ 是...
在 Java 中,i = i++ 代码的执行结果可能会让人感到意外。下面我们将对这段代码进行详细的分析。 首先,让我们看一下这段代码: ```java int i = 0; i = i++; System.out.println(i); ``` 乍看之下,人们可能会认为...
"java中的i++和++i的区别详解" Java中的i++和++i是两个非常重要的运算符,它们都是对变量进行自加操作,但是它们的执行顺序和结果却有所不同。 首先, let's 看一下它们的定义: * i++:后加加,先使用变量的当前...
在C/C++中,后缀递增运算符(i++)和前缀递增运算符(++i)都用于将变量增加1,但它们的操作和结果在某些情况下有本质的区别。前缀递增运算符++i先增加变量的值,然后返回新的值。后缀递增运算符i++先返回变量当前的值,...
使用++i和i++可以使迭代操作变得容易,但是两者到底区别在哪可以从这个程序中得知,使用java语言编写
C++ 中的左值和右值、i++ 与 ++i 的区别 在 C++ 编程语言中,左值(Lvalue)和右值(Rvalue)是两个重要的概念,它们在变量和表达式中的角色不同,理解这两个概念对于编写正确和高效的代码非常重要。 左值(Lvalue...
解压后先执行sql,修改ruoyi-admin/src/main/resources/application-druid.yml中的数据库账号密码,在ruoyi-ui命令行中执行npm i待完成后再执行npm run dev。启动项目请先确保redis状态为启动中,redis文件可在我的...
在书中,两位作者详细地讲解了Java的基础知识,包括但不限于数据类型、运算符、流程控制、数组、字符串处理、面向对象编程、异常处理、输入输出(I/O)流以及多线程编程等核心概念。每一章节都可能包含一些特定主题的...
在Java编程语言中,`i++` 和 `++i` 是两种常见的自增操作符,它们在处理变量的自增时表现出不同的行为。这两个操作符都用于将整型变量的值增加1,但在某些特定情况下,它们的区别可能导致程序执行的结果不同。 首先...
内容概要:详细讲解了在C、C++、Java、JavaScript等多种编程语言里,前缀递增(++i)与后缀递增(i++)的具体区别及其使用时机。文章指出两者虽然最终都使变量增加了1,但在复合表达式中因为执行顺序的不同会产生...
本科毕业设计-Java-vue+springboot教务管理系统.zip本科毕业设计-Java-vue+springboot教务管理系统.zip本科毕业设计-Java-vue+springboot教务管理系统.zip本科毕业设计-Java-vue+springboot教务管理系统.zip本科毕业...
在编程语言中,如C++或Java,"i++"和"++i"都是自增操作符,它们用于增加变量的值。这两个操作符的主要区别在于它们如何处理变量的值和何时更新这个值。 首先,让我们理解"i++"。这个操作符被称为后缀自增。当你在...
内容概要:本文详细介绍了前置自增(++i)和后置自增(i++)运算符的区别及其应用场景,涵盖C/C++、Java、JavaScript等多门语言。重点讨论了两者在返回值、执行顺序以及在复杂表达式中的差异,并探讨了编译器优化的...
在Java编程语言中,`i++` 和 `++i` 是两种不同的自增操作符,它们在表达式中的行为和优先级是理解此问题的关键。`i++` 是后置自增运算符,它首先使用变量`i`的当前值,然后将其加1;而`++i` 是前置自增运算符,它先...
Java与JavaScript的区别** - **开发背景**: - Java是由Sun Microsystems公司开发,面向对象的编程语言。 - JavaScript最初由Netscape公司开发,主要用于网页的动态效果和与用户的交互。 - **特性对比**: - **...