某网友关于++运算符的问题

来源:互联网 发布:控制网络的软件 编辑:程序博客网 时间: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#中的情形到底如何,玄机逸士还没有试过,不便妄言。有兴趣的朋友可以做一个简单的实验,如果能把实验结果告诉我,那就太感谢了! 

原创粉丝点击