代码1
public static void main(String args[]){
int i=0;
i=++i;
System.out.println(i);
}代码2
public static void main(String args[]){
int i=0;
i=i++;
System.out.println(i);
}代码1输出 1
代码2输出 0
这使我对++运算产生了疑惑,请教一下++运算的内部机理
public static void main(String args[]){
int i=0;
i=++i;
System.out.println(i);
}代码2
public static void main(String args[]){
int i=0;
i=i++;
System.out.println(i);
}代码1输出 1
代码2输出 0
这使我对++运算产生了疑惑,请教一下++运算的内部机理
解决方案 »
- 请教一个list与hashMap的问题
- 求解:用相对路径访问classes目录外面的文件,以及用相对路径创建File和InputStream对象
- 请问这句话对不对
- 难道是SUN提供的类库有问题吗?受不了,快疯了。
- 在线等:获取System.in得到的字符串,总是少第一个字符。郁闷......
- java中,月份为什么是从0到11
- 老是出现异常,在str.reader(raf)这行,求解释
- 下载了一个HttpClients包,可是不知道应该把它放在哪
- 如何获取当前目录(或当前class的所在目录)?
- 求教,初学者的问题。
- 谁来说说java 在什么情况下内存泄露?
- JBuilder 2007中JFileChooser问题
我们可以这样拆分1
int i=0;
i=++i;
System.out.println(i);
-->
int i =0;
int j;
j = ++i;// j=1
i =j;
sysout (i);2. int i=0;
i=i++;
System.out.println(i);--->int i=0;
int j ;j = i++; ///j=0
i=j;sysout(i);
i=i++被拆成j=i++;i=j;但是如果按这样的逻辑,这里的j=i++又会被拆成k=i++;j=k;再这样拆下去没有止境了
i=j;
这里只是为了解释 i=i++; 其实只进行了一次拆分
int i;
int operatorAddAdd(){ //前自增
return i+1;
}
int operatorAddAdd(int n){ //后自增
int j = i;
i+1;
return j;
}
}当然这段代码是错的,你可以借助他来理解,o(∩_∩)o...
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i=0;
int j=i++;
System.out.println(i);
}}
这段代码输出的是1,原代码 i=0;i=i++;输出是0,
public class wz { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int i=0;
i=i++;
i++;
System.out.println(i);
}}
这段代码输出的也是1;这说明i=i++;语句使i指向i自加前的内存空间,
注意:i只是对象的引用
i=i++;的执行步骤:
i指向一块内存空间,存储的是0;执行i++时重新分配一块空间,存储1;
=使引用i指向存储0的内存空间。
i++是指在执行该语句后才加1;++i是指加1以后再执行该语句;
如果是先赋值的话i=i++等价于(i=i)++,可是(i=i)++这个语句根本就是错的,没法编译的
那么++i就是先执行i+1,在执行i=i+1,即先执行自加运算,再执行赋值运算
那么i++就是先执行i=0,在执行i=i+1,即先执行赋值运算,再执行自加运算运算符的优先性及结合性,参见C语言附表。。