批判一个有关++的Java选择题
又是++,木有营养啊……
这是在****的Blink看到的题:
这位童鞋选错了,其实可能是他不会做选择题,这起码你不能选100吧,这种题必然坑题啊,再加上他给的是j++,不是++j,显然选A啊。
你觉得答案是A?
那你就错了,真不是……我只是讲了一下作为一个选择题你拿不准怎么去解,这答案可不对呦。
其实我是同情这位童鞋的,他是无辜的啊,毕竟答案都错了……谁叫他/她有一个不着调的老师呢?
实践出真实,大力出奇迹
既然觉得题不太对,那就——
测试测试测试!!!
我们先用jshell测试(预期可能是9/10/11):
答案不是99/100/101吗?咋是0?
我写错了?莫得莫得,晕了,再来,可能是jshell变量处理太随意了吧,我们再来:
还是……我%#%¥……#……[email protected]@@#
那好,我们一句一句来:
我绝望了,上IDE吧:
一口老血喷出来,那好,我们做个对照实验:
竟是一样的!!也就是说这个100的来源真实是j++;
而非j = j++;
,j = j++;
真的是得到 j=0!!!
把 j++ 换成 ++j 试试:
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。
结论
这是一个极其没有营养的题,做错的孩纸我同情你,不容易哇……
反正这种题我是看恶心了,没事干谁天天写这种垃圾语句,怕不是得被同事打死……实际开发谁有功夫研究这个东西怎么用,真是的。。。
就到这里,溜了……