批判一个有关++的Java选择题

又是++,木有营养啊……

这是在****的Blink看到的题:
批判一个有关++的Java选择题

这位童鞋选错了,其实可能是他不会做选择题,这起码你不能选100吧,这种题必然坑题啊,再加上他给的是j++,不是++j,显然选A啊。

你觉得答案是A?
那你就错了,真不是……我只是讲了一下作为一个选择题你拿不准怎么去解,这答案可不对呦。

其实我是同情这位童鞋的,他是无辜的啊,毕竟答案都错了……谁叫他/她有一个不着调的老师呢?

实践出真实,大力出奇迹

既然觉得题不太对,那就——
测试测试测试!!!
我们先用jshell测试(预期可能是9/10/11):
批判一个有关++的Java选择题

答案不是99/100/101吗?咋是0?
我写错了?莫得莫得,晕了,再来,可能是jshell变量处理太随意了吧,我们再来:
批判一个有关++的Java选择题

还是……我%#%¥……#……[email protected]@@#
那好,我们一句一句来:
批判一个有关++的Java选择题
我绝望了,上IDE吧:
批判一个有关++的Java选择题
一口老血喷出来,那好,我们做个对照实验:
批判一个有关++的Java选择题批判一个有关++的Java选择题
竟是一样的!!也就是说这个100的来源真实是j++; 而非j = j++; j = j++; 真的是得到 j=0!!!

把 j++ 换成 ++j 试试:
批判一个有关++的Java选择题
Warning……醉了:The assignment to variable j has no effect.(翻译过来是:变量j的赋值无效。)

问题分析+吐槽乱喷

皮完了,下面来分析一下问题。
这个问题主要是j = j++; ,这个语句太狗了,这不神经病吗?
你++还不完,还得赋值,&&¥%#@¥@!@!#%**……

本身很简单,一个与求值变量(j)无关的变量(i)作为for循环的counter启动100次循环,反复执行这么个没营养的语句然后求值。

问题是:j = j++; 这玩意到底是啥?

首先,我们要知道运算符优先级,++、–这种单目运算符是优先于=这种赋值运算符的(注意+=、-=的优先级则是低于=),所以会先执行++后赋值。

那么问题又来了,我们有些初学者对b = a++; 的理解可能是先赋值再自增,而b = ++a; 则是先自增再赋值,这就会引发困惑啊。
其实这种理解是不正确的,可能有的大学老师为了方便入门萌新理解,会这么说,其实自增是优先的,我们应该换个角度这么理解这件事(我个人的理解):
虽然是先自增,我们能不能吧++当成一个函数呢?

  • b = a++; 中,a自增以后返回一个原来的a值给b。
  • b = ++a; 中,a自增以后返回一个自增后的的a值给b。

这样,问题就显得清楚了很多:
对于j = j++; ,j++,j变成了1,但是返回的是原先的j,值为0,相当于又重新把原值0赋给了j,这样,每一次循环下来j的结果永远是0,导致了输出是0。

结论

这是一个极其没有营养的题,做错的孩纸我同情你,不容易哇……
反正这种题我是看恶心了,没事干谁天天写这种垃圾语句,怕不是得被同事打死……实际开发谁有功夫研究这个东西怎么用,真是的。。。
就到这里,溜了……