一道c++的题目改成java版本后引众多java码农争论,很多人都错了
喜欢的可以收藏转发加关注
去年曾经一道c++的题目在网上引起众多码农的热议,题目就是两个函数,在第一个函数中定义了变量a与b的值,并且调用了第二个函数,而第二个函数是一个空函数,有两个参数a与b, 第一个函数末尾打印出了a与b的值,要求同个实现第二个方法,达到打印出来a,b的值是交换后的效果。
针对这样一个题目,有好多c++的码农们争相讨论,当时有部分人耍了一点小聪明,实现思路是在第二个函数中直接将a,b的直交换然后打印出来,并退出整个程序,让第一个函数中的打印不再继续执行,虽然这样的做法不是出题人预想的套路,但是确实也达到了要求的结果,只有少人码农网友给出了正确答案,那就是通过内存寻址的方式直接调整a与b的值,想必这个思路才是出题人想要的那种吧。
很巧的是,这个题目今年又有人出了一个java版的,既然两种语言不一样,当然实现思路也是不一样了,我们把这个java版的题目贴出来,看看码农们都是怎么回答的吧,让我们一起看看他们的思路是什么吧。
网友一:这个题目写a=a+b,b=a-b,a=a-b基本可以判定java还没入门了。
半只程序员:当然,这种情况下是值传递,完全达不到意想的效果。
网友二:就是为了交换值类型把值类型封装成引用类型,再把引用类型指向的内存地址的值交换的无聊操作
半只程序员:虽然思路是这样,但是java与c的实现方式差别很大。
网友三:python的变量也是引用类型啊,a,b=b,a就完事了
半只程序员:没错,如果是python的话,解决这个问题就显得更为直接了。
网友四:考java语法有啥意义,还不如考算法。
半只程序员:这样的题目只能是拿出来交流用,在实际工程中压根碰不上这样的场景,如果出现这样的场景,只能说程序者的设计思路太奇葩了
网友五:可能有些人不会Java,只是按照自己熟悉的语言理解,你只站在自己视角来看未免太狭隘
半只程序员:没错,从上面的回答就能看出有的网友是其他语言的思路。
网友六:光从题目看,+-^多种做法,学的时候或者培训的都讲过,不论是c还是Java,考新人见过,写反射的那个从题目上没毛病,体现多会一点
半只程序员:这个题目有网友用反射的思路实现了,请看上面的那个图。
网友七:异或就可以
半只程序员:是不可以的,如果在第二个方法中去实现的话,传值的方式,在第二个方法任凭你怎么修改就是无法改变的哦。
网友八:涉及到引用,值传递,IntegerCache还有反射这些知识点。并不是用异或或加减操作一下就可以的。还是要动手,要认识到你是苦逼的javaer,并不是c。
半只程序员:没错,这名网友的观点是正确的,针对同样的题目,java自然有java的思路。
可见这个题目,回答正确的人并不是很多啊,大多数人都知道a=a+b,b=a-b,a=a-b 这样的方式是不可以的,可是有部分人却误认为a=a^b;b=a^b;a=a^b;这种方式是可以的,其实不然,如果是放在第一个方法中去实现,这两种方式显然是都可以的,但是在第二个方法中去实现就完全是另一种思路,首先通过简单的值传递,不论你怎么努力,却是丝毫不会改变a与b的值的,c++中的思路是通过直接修改内存的方式来修改a与b的值,而java呢,当然java中所有对象都算是一个引用,但是这里交换对象的本身,针对这样的场景,java自有java的思路,提到反射来说,其他语言的程序员可能觉得过于复杂了点,不过,话又说回来,这样的题目也只能在平时交流时提提而已,实际的项目工程中绝对不会出现这种场景的,如果要是出现了,只能说设计程序人思路很奇葩,这是自己在给自己找困难,针对这样的问题,不同语言有不同的语言的解决办法,只不过有的语言相对轻松,而有的语言就需要费一番周折了。
学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料和视频