某网友关于++运算符的问题
来源:互联网 发布:控制网络的软件 编辑:程序博客网 时间:2024/05/17 01:11
某CSDN网友的问题如下:
int i = 0, j = 0;
i = i++;
System.out.println(i);
j = i++;
System.out.println(i);
结果是0 1
很费解为什么。。。
总是不明白。。
为什么不是1和2??
希望能有人给我讲明白下。。
我是新手。。。
玄机逸士的回帖如下(经过稍加修正):
*******************************以下是回帖*******************************
lz的代码如果对应地翻译成C++代码,输出的结果就会如你所愿。:)
为了详细解释你的困惑,我觉得还是要首先了解++的用途。它的出现是为了简化下面这样的语句:
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++代码)。所以,同时掌握Java和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呢?和Java不一样,在C++中i = i++;运行完成后,i的值将为1。后面输出2的情形就不用再解释了吧。
总结一下:
a. 尽量不要象i = i++;使用++运算符;
b. 如果非要那样写,必须注意在不同的语言中,加1的运算所发生的时间点是不同的:
在Java中,i = i++; 的加1操作是在该语句执行完成后,并且在下一个操作完成后才进行的;
在C++中,i = i++; 的加1操作是在该语句执行完成后就进行了。
希望上面的文字解决了你的困惑。
******************************以上是回帖*******************************
初看那位网友的问题时,原以为很简单,没有想到其中还有一些奥妙。看来学问之道,是不能 take it for granted的。另,在C#中的情形到底如何,玄机逸士还没有试过,不便妄言。有兴趣的朋友可以做一个简单的实验,如果能把实验结果告诉我,那就太感谢了!
- 某网友关于++运算符的问题
- 回某网友关于AxD的仿真问题
- 关于相机标定的问题答复网友
- 关于相机标定的问题答复网友
- 关于++运算符的问题
- 关于自加运算符的问题
- 关于位运算符实现的问题
- 关于C#算术运算符的问题
- 关于php三元运算符的问题
- 关于运算符问题的两道面试题
- 关于!运算符使用的问题
- 关于运算符重载的问题
- LinuxC关于运算符的一些问题
- 关于业务用例抽象问题对网友的回复
- 回复网友 man1231,关于业务目标界定的问题
- 答网友关于base64算法的汉字编码问题
- 关于字符串的运算问题
- 网友总结的一些问题
- 测试PHP中的布尔(boolean)类型
- 16 Tools for Server Performance Tuning and Monitoring
- 数据库主键、外键、表结构查询
- 检测内存泄漏的方法
- 如何让一个系统崩溃
- 某网友关于++运算符的问题
- 关于医院精确套打发票的实现
- 100z盏灯问题
- flex第一步
- 最近的工作总结
- 请大家提点关于电子商务发展的意见!
- 大型网站的架构
- BugFree和SVN的整合 for windows 带调试输出版
- 编余偶记:《什么是数学》、《我们在微软怎样开发软件》