张慧的博客

张慧的博客

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

文章的楼主连左值都可以运算,还若无其事得当作可以编译,在那讲解,若无其事就算了,可以当做没有发现编译问题,但是那讲解也太误导人了吧?然后我跟帖的楼下还出现一个“石破天”,以教导式的口吻,在那讲解,不知道的人岂不是就信了吗?真真一群害人之马,当然我只是指其中几位,很多跟帖的朋友,我自认还是不如的。

就为了这个影响广泛的害人帖子(在csdn上弹框出来,影响能不小吗?),我也来探讨一下i++,我是菜鸟,我不会用教导式口吻来讲解。

首先说文章楼主提到的

if((i++=j++)!=4){}  

看到这句代码我真想喷,因为这让我对自己产生了不自信,还去编译了一下,果然是错误的,左边怎么能够进行运算呢?楼主真强大...为什么昨天没有写文章,没有情绪激动,因

为我知道C++风格也是这样赋值,不知道能不能编译过去,但是今天看到跟帖的朋友说,VC98过不去,DEV-C++也过不去,我才感到真有一种被耍的感觉。“左值能运算吗?What  the hell!"这一句,只是骂我自己怀疑自己,没有对其他任何人。

假设,楼主是手误,咱们来一个正确的能编译的代码讨论一下:

int i=4,j=3;   
if((i = j++) != 4) {}  

j++的具体动作应该是怎样的,我想看过《Thinking in Java》的朋友都掌握得还不错,如果实在想找更深入一点探讨i++的书,个人看过《Java程序员面试宝典》,里面有提到i++这个部分,讲得很仔细。j++,是一个依赖于java里面的“中间缓存变量机制”来实现的,很多人都会念++在前就是“先加后赋”,++在后就是“先赋后加”,但是这个“赋”和这个“加”是针对哪个对象呢,有几个人能清楚的解释?“宝典”这本书上面的解释,个人觉得非常好,就来这里秀一段。首先,像文章中2楼所说那样:++的时间是以整个语句为衡量的,所以,什么时候自增,跟一整句运算语句有关,现在的情况是 i = j++:这样一句应该被拆分为:

 

temp = j;//先赋
j = j + 1;//后加
i = temp;

 

再来一个i = ++j:这一句应该被拆分为:

j = j + 1;//先加
temp = j;//后赋
i = temp;

用这样的语句,来解释“赋”跟“加”应该是很明了的吧?记住,“加”只涉及了本身,“赋”涉及本身和中间缓存变量。

如何理解“++的时间是以整个语句为衡量的”?咱们来一段复杂的就可以很好地理解了,就拿那个被我喷的“石破天”的吧。

 

/* 这个是原式,尊重版权,但是误导人*/
int i=10;
i=i++ + i++;//20  --这里应该会是21,note by jacob
i=++i + ++i;//44  --这里应该会是45,note by jacob
 

 

首先咱们把这都拆开来理解:

/* 细说第一个 i = i++ + i ++; */
temp1 = i;//temp1 == 10
i = i + 1;//i == 11;
temp2 = i;//temp2 == 11
i = i + 1;//i == 12;
i = temp1 + temp2;//i == 21

/*第二个 i = ++i + ++i;*/
i = i + 1;
temp1 = i;
i = i + 1;
temp2 = i;
i = temp1 +temp2;


这样的例子,应该算是比较复杂的吧?如果需要,还可以来一个更加复杂的,不过不再详细解释,大家可以拿来推敲一下:

int j =0,k = 0,h=0;
k = k++ + k++ + k++ + ++k;//k == 7
j = ++j + j++ + j++ + j++;//j ==7;
h = ++h + ++h;
posted on 2012-08-01 21:56 张慧 阅读(2816) 评论(1)  编辑  收藏

Feedback

# re: 探讨i++和++i 2012-08-02 12:37 Unmi
++ 拿出来做学术研究还是可以的,但它也是依赖于编译器的,是怎么个理,反汇编,或是看看字节码码就知道的清清楚楚了。

但要是工程中也写出 ++,-- 随意飞的代码,那就要拖出去打屁股了,当然学生除外。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: