int i = 0, j = 0;
i = i++;
System.out.println(i);
j = i++;
System.out.println(i);
结果是0 1很费解为什么
总是不明白。。
为什么不是1和2??
希望能有人给我讲明白下。。
我是新手
i = i++;
System.out.println(i);
j = i++;
System.out.println(i);
结果是0 1很费解为什么
总是不明白。。
为什么不是1和2??
希望能有人给我讲明白下。。
我是新手
解决方案 »
- 用什么办法可以消除“游戏结束”这几个字被覆盖的
- 使用Graphics绘图简单例子问题
- 木马怎么写啊?急急急!
- 请教,如何用java实现程序进程唯一?
- String 型 转Date型 急
- 100分,关于数据库的数据转移问题
- 那位大哥配置过"洋溢论坛",我设置了数据源,把yy目录也加到了classpath..并且把forum整个目录放在以tomcat的webapps下...可是通过http://l
- 征集: JAVA中可能引发的异常及其含义——内详!
- 关于jdbc的问题
- Invalid <url-pattern> /*.* in filter mapping
- java如何实现树的孩子兄弟表示法
- hibernate 数据类型转换问题
i++:先引用后自加
++i:先自加后引用int i = 0, j = 0;
i = i++; //换成i=++i 试下
System.out.println(i);
此时 i=0 j = i++;
System.out.println(i);
这时候i已经自加过了
i=1
System.out.println(i);
i++; //这样会打印1,2
System.out.println(i);
j = i++;
System.out.println(i);
//这个问题问得不错
//java的编译器在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉
k = i++;
i = k;
System.out.println(i);
j = i++;
System.out.println(i);
那么i=i++ 就是把i=0 先赋值给了i 然后i自加了1之后就变成1了
j=i++ 同样是把i=1的值先给了j 然后i自加1变成了2
为了详细解释你的困惑,我觉得还是要首先了解++的用途。它的出现是为了简化下面这样的语句:
i = i + 1;
简化为:
i++; // i值先参与运算,然后再加1
或者:
++i; // i值先加1,然后再参与运算
如果单独写为一行,i++;和++i;是一样的,因为除加1外,没有需要参与的其他运算。既然是++的用途是如上所说,那么:
i = i++;
这样的用法就很不合适了,而且可能会发生混乱,要尽量避免,也就是说,在使用++这样的运算符的时候,等号左边的变量名和等号右边的变量名不能是一样的,你要么写成:
i++;
要么写成:
i = i + 1;
而不能写成:
i = i++;
因为,先左边的i等于右边的i(开始为0),然后右边的i加1,做完这行的运算后,i到底是0还是1呢?不同的编程语言是不太一样的,在java中i = i++;运行完成后,i的值仍然为0,直到它参与运算完下一次运算后,再加1。(C++则不同,请看后面的C++代码)。所以,这样的写法最好杜绝。如果你的代码改写成:
public static void main(String[] args)
{
int i = 0;
//int j = 0;
//i = i++;
System.out.println(i++); (1)
//j = i++;
System.out.println(i++); (2)
}
就更符合++这个符号的要求。同时也更好解释为什么输出结果为0和1了:
在(1)中,i首先等于0这个值参与println运算,因此输出0,然后i加1,此时i等于1了;
在(2)中,i首先等于1这个值参与println运算,因此输出1,然后i加1,此时i等于2了。如果你的代码再改写成:
public static void main(String[] args)
{
int i = 0;
int j = 0;
int k = 0;
k = i++;
System.out.println(i); (3)
j = i++;
System.out.println(i); (4)
}
那么输出结果就是:
1
2
上面代码中,我只加了另外一个int变量k,而且是用
k = i++;
来代替:
i = i++;
这样就一切变得很好解释了。所以,最好不要写成: i = i++; 这样的形式,写成k = i++; 尽管不是很优雅,但语义上还是很容易解释的。
把你的Java代码翻译为C++代码如下:
#include <iostream>
using namespace std;
int main(void)
{
int i = 0, j = 0;
i = i++; (5)
cout << i << endl; j = i++;
cout << i << endl; (6) return 0;
}
输出结果是:
1
2解释:
前面说道C++和Java对于++运算符处理的不同。在上面C++代码(5)中,先左边的i等于右边的i(开始为0),然后右边的i加1,做完这行的运算后,i到底是0还是1呢?不同的编程语言是不太一样的,在C++中i = i++;运行完成后,i的值将为1。后面输出2的情形就不用再解释了吧。总结一下:
a. 尽量不要象i = i++;使用++运算符;
b. 如果非要那样写,必须注意在不同的语言中,加1的运算所发生的时间点是不同的:
在Java中,i = i++; 的加1操作是在该语句执行完成后,并且在下一个操作完成后才进行的;
在C++中,i = i++; 的加1操作是在该语句执行完成后就进行了。希望上面的文字解决了你的困惑。
例:
int i=0;
a=++i,得到的结果是先把i加1,即i=i+1,这时i=1,然后将值赋给a,最终a=1;
b=i++,得到的结果是先把i的值赋给b,这时i=0,即b=0,然后将i加1,但不影响b的值,最终b=0