如何看待问“a = a + b和a += b有什么区别”的Java面试官?

黄鑫


说实话,如果你的面试官喜欢问这种问题,你可以得到一个结论和做一个决定了!

这个结论是:这个面试官水平应该不算高!

这个决定是:这家公司不要去了吧!

中国大学编程基础教学最大误区之一:纠结于各种a++和++a等游戏

我曾经大学的时候,学习C语言的时候,就是用的某著名教授的畅销千万册的书籍,那时候给我的感觉就是这本书我真的是看不懂,感觉看得是迷迷糊糊的,完全不知道在讲什么,到了重点的指针什么的也感觉都是犹抱琵琶半遮面。

那时候我的C语言老师,最喜欢搞这种a++和++a的游戏,而且几乎每一次上机测验一定会有一个题目是关于这个的题。

甚至一度我都怀疑是我自己不行,因为听不懂,感觉老师讲的都是天书,而且感觉老师总是要花时间讲一些奇奇怪怪知识点,这就是我那时候对于C语言这门课最大的感觉。甚至一度连我这个曾经中学时代就看过一些VB书籍,而且自认为中学时代数学、物理好到爆的学生,都开始怀疑自己,是不是我逻辑思维有问题。

关键是按照老师的做,居然还能考高分,更可怕的是考了高分以后都不知道自己为什么考到的高分,是真的C语言学好了吗?显然不是!

后来我实在感觉已经快失去对C语言的最后一点信心了,只是觉得这样下去不行,我只好自己去百度、去Google,然后自己找资料,现在想想应该感谢这么课,然后我自己找到了C Primer Plus,最后找到了K&R C,让我明白不要过分纠结于语法游戏,对于真正学会编程到底是有多重要。

并且因为这门课让我没有被禁锢住,养成了我大学几年坚持用GitHub、stack overflow、Google、以及学会使用查官方文档的好习惯。

中国大学编程基础教学最大误区之二:万年不变VC6.0

这是我学生时代经历的又一大痛楚!

那个年代macOS不能用VC,Windows7上安装VC6.0也是极为痛苦的,我记得第一次上机实验的时候,我用codeblocks写了程序然后交上去,老师又让我用VC6.0重写了,于是我只好跑到机房去用那个windows XP上的VC6.0又把作业重新做了一遍提交上去。

我当时就在想,为什么我们的老师不能为了适应一下时代,就算是不用Xcode这种,用一下比较新版本的codeblocks/devc++,或者是用新一点的visual studio 2008也行啊,要知道VC6.0从1998年发布到现在足足二十年了!

总之,我觉得编程,应该更多的关注到编程本质上来,而不是纠结于那些对于编程水平并没有实质性提高的语法细节,多关注关注算法、数据结构我觉得价值更高!


EmacserVimer


哼哼哼,本姑娘,被Java吊打了两年的计算机专业学生来告诉你:千万别以为a=a+b和a+=b是一样的!

事实上,它们有一些类型和精度上的差异。

这两种形式的主要区别在于是否进行数据类型的自动转换,当两个操作数同类型时这两种形式的运算结果是没有差别的,当两个操作数数据类型不同时,且左操作数即保存结果的操作数的数据精度要低,此时这两种形式就有区别了。

上面这段话有点绕,举个例子:

public classDemo

{

public static void main(String[] args) {

short a=4;

int b=5;

a+=b;

System.out.println(a);

}

}

看这个简单的小程序,定义a是short型的变量,b是int型的变量,当执行a+=b时,能输出答案为9,程序没有问题的。

但是!!!

如果把代码稍微变一变:

public classDemo

{

public static void main(String[] args)

{

short a=4;

int b=5;

a=a+b;

System.out.println(a);

}

}

变成a=a+b之后,就会产生错误:



类型不匹配。

原因是:“+=”这个运算符在Java中是一个运算符,而不是两个,程序在执行“+=”时,会自动向高精度进行数据类型转换。所以第一个程序在执行时编译器没有报错。

而“=”呢,它要求=两边类型一致!我们的代码中,因为a是short类型的变量,而b为int类型的变量,short类型+int类型结果肯定会自动转换成int类型啦,此时就存在数据类型不一致的问题,用short类型的变量去保存int类型的变量编译器当然会报错了。

就好比你用装一两水的杯子去装二两水,当然是装不下的,如果你非要用装一两水的杯子去装二两水,肯定可以硬到进去,但是肯定会洒掉一部分水。所以如果这里非要用short类型的变量去装int类型的数据,可以用强制转换,确定是会丢失精度。

以下是强制转换后的结果:

public classDemo

{

public static void main(String[] args)

{

short a=4;int b=5;

a=(short)(a+b);

System.out.println(a);

}

}

强制转换之后,还是可以的了啦。

看到这里,你明白这两者的区别了吗?

没有明白的话,红红火火恍恍惚惚,问吧,还有哪里不明白!!!


日常程序媛


你好,技术面试的话,针对java面试,我是深有体会的,因为我被别人面试过,反过来,我也面试过别人,这种面试既是对参加面试者的考验,也有很大程度是对面试官的一个考验,因为作为java面试官,一般他已经坐到了技术经理的位置,或则是一个公司的资深研发级别了。接下来我们从几个方面分析下问a+=b这种问题的java面试官。

1.技术经理

java面试其实也分几种初中高级别,作为一个公司的技术经理的话,如果是这种位置的人去面试你,问你这种a=a+b和a+=b区别的问题,一般他就是想看看你基础扎实不,如果他问出你这样的问题,那么在他心里他都会给你事先定好了一个级别了,初级,如果好一点的话,最多能给你定个中级java开发。技术经理是有这个权利的。你不要去想面试你的人水平怎么样,你作为应聘者,只管回答好面试官的问题好了。

2.资深研发

面试你的人也有可能是一个公司的资深研发,他看完你的简历,当你介绍完你的工作经历后,如果还问你这种a+b的问题,那么他很有可能只是想缓解下紧张的气氛,以这种他认为很简单的问题去打开你们之间的交流,让你不要那么紧张而已,这种情况,你就放平心态,好好回答就行了,当然了,这个问题也直接关乎你们接下来他会问你什么难度的问题,如果你答得很符合他的预期,他对你就很满意了,接下来也不会多么的难为你,可能会问你更加深入的问题,但是你答出个大概,加上他的提示你能继续下去,这个面试也就八九不离十了,当然,他是没权利给你定级别的,他会把你的面试情况反馈给上级,由上级决定你的级别。

其他情况,面试官问你这种问题,在中小型公司他也有可能只是一个中高级开发,或则是个项目经理也是有可能出现的。只是这种情况相对较少,我们就不多做描述了。

本人阅历有限,如各位看官有其他看法,欢迎多多指教,不胜感激。


IT讲坛


a=a+b 是加法运算,需要两次寻址。a+= b是增量运算,有寄存器优先时,只有一次寻址。赋值运算是一样的。一般情况下可认为两者一样。但前者与数学算法描述更接近,相对来说更严谨。后者书写快捷,但可读性略有下降。综合考虑,还是用a= a+ b形式更好,毕竟可读性更好,效率差异微乎其微,在高速运算时代基本可忽略。


散居猎人


java不太清楚,c/c++里面考虑的话a=a+b会先生成一个临时变量a然后a=a+b,而a+=b不会产生临时变量,直接在变量a上加b,效率会高一些。这就好比写一个循环的时候,++i比i++效率高一样


管理员账号


估计提问的人,才做Java没几年,问有什么区别并不是真的难为你,而是想问你基础扎实还是不扎实,Java代码细节很重要,要不然bug找起来起来很困难,很简单的道理,如果做一个银行结算功能,你不知道i++和++i的区别,就有可能把钱算错,测试出问题需要花费大量的时间排查是数据库数据有问题?还是算法问题?或者界面传值有问题?结果查了一天发现是自己写的循环有问题,这还是发现出来的,如果测试量少,没有发现呢?

还有如果你不知道arrayList和linkedList的区别,不知道stringbuffer和stringbuilder的区别,不知道map扩容机制,然后你就会发现,你的代码最烂,bug最多,效率最底下,项目组也会计算成本与人工花费的!代码的细节真的很重要!

最后一句话,如果你知道可以不屑回答,但是,不知道还是安心的补充知识吧!


雾隐江南27967034


纠结这种炫技大于实用的东西有什么意义?这不就跟茴香豆的茴字有几种写法一样吗?如何在最短的时间内写出来符合用户需求的系统并且把它卖出去,还得保证代码没有bug避免过多的售后技术支持成本,这才是企业最应该做的。


万政通达


回答没区别的,初级程序员。说了一堆类型转换问题的,中级程序员。在知道类型转换后,给出建议,代码要求尽量用a+b的,高级程序员(因为高级程序员有可能不是写java出身,可能真的不知道java类型转换问题)。所以说,这个考点还是有意义的。初级程序员,对编码熟悉,中级对语言熟悉,高级就要考虑软件部署运维问题了。


沧海孤烟


是先后的区别,++在前的都是先干了再说,++在后就是先说好了再干。

在单独计算是没有区别的,在拿去跟一些计算运用起来,就有区别了。


疯狂大世界


怎么思考重要于思考什么问题。

细节关键成败;严谨细致是应有的态度;全局考虑是应有的思考;时间成本是最大的成本。

面试官肯定是在项目中被如此的细节虐过的人,数值计算看似简单,加上类型与精度,变量上的传递,不注意错误就会一层层的被包裹黑匣子。产生不必要bug,无形增加时间成本。

面试官还是个项目经理人,他了解精度问题一半是在客户应用时才容易被发现:例如财务会计是不许有一分钱的差异的,而这样的结果需要更多的实际数据才会出现(税的计算是小数点后四位)。

面试官知道系统开发到客户手中运行再运维,使用更长时间,任何一个返工都是编写的几十倍的时间成本。

面试官还希望你看到过程质量控制体系的重要。

面试官问什么问题其是有原因的就看你:

怎么思考,而不仅是思考什么问题。

基于从上向下、横向联系、实际出发来分析一下这个问题。

或许是我小题大作了!


分享到:


相關文章: