首页 > 其他分享 >面试考代码,居然翻车了!

面试考代码,居然翻车了!

时间:2023-06-11 23:07:43浏览次数:40  
标签:count 10 ++ 代码 面试 int 翻车 public


你好,我是田哥

今天早上,一位同学去现场面试,面试官现场写一段代码,请看代码:

/**
 * @author 公众号:java后端技术全栈
 * @date 2022年11月07日 
 */
public class Solution {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 10; i++) {
            count = count++; 
        }
        System.out.println(count);
    }
}

问:这段代码输出多少?

然后,面试官,继续改造代码:

/**
 * @author 公众号:java后端技术全栈
 * @date 2022年11月06日 21:01
 */
public class Solution {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 10; i++) { 
            count ++;
        }
        System.out.println(count);
    }
}

又问:那这段代码呢?

面试者:我屮艸芔茻呢,这是要考我什么?感觉这代码很简单呀,为什么考我?肯定有坑。

面试考代码,居然翻车了!_spring

再回头看看代码,没毛病呀,然后随口而出:都输出10

面试考代码,居然翻车了!_java_02

看到面试官礼貌性地微笑,我就知道掉进坑里了。

好了,我们回到第一段代码:

int count = 0;
for (int i = 0; i < 10; i++) {
  count = count++; 
}
System.out.println(count);

这段代码认为输出10的请举手!

对不起,你的答案错了,正确是:0

为什么输出0呢?

我们可以把count++理解一个表达式,是有返回值的,它的返回值就是count自加前的值,Java对自加是这样处理的:

首先把count的值(注意是值,不是引用)拷贝到一个临时变量区,然后对count变量加1,最后返回临时变量区的值。

程序第一次循环时的详细处理步骤如下:

  • 步骤1: JVM把count值(其值是0)拷贝到临时变量区。
  • 步骤2: count值加1,这时候count的值是1。
  • 步骤3: 返回临时变量区的值,注意这个值是0,没修改过。
  • 步骤4: 返回值赋值给count,此时count值被重置成0。

count=count++我们用一个java代码表示如下:

public static int add(int count) {
        //先保存初始值
        int temp = count;
        //做自增操作
        count = count + 1;
        //返回原始值
        return temp;
}

于是第一次循环后count的值还是0,其他9次的循环也是一样的,最终你会发现count的值始终没有改变,仍然保持着最初的状态。此例中代码作者的本意是希望count自增,所以想当然地认为赋值给自身就成了,不曾想掉到Java自增的陷阱中了。

解决办法

其实,上面的两段代码的目的就是想输出10,但是由于使用不当导致了第一段代码输出了0。

解决办法也非常简单,只要把count=count++修改为count++、或者改成count = count +1

所以第二段代码输出是10,就毫无疑问了。

该问题在不同的语言环境有不同的实现:C++中count=count++count++是等效的,而在PHP中则保持着与Java相同的处理方式。

提醒

平时,我们在开发中难免会用到i++之类的操作,切勿犯类似的错误哈。


标签:count,10,++,代码,面试,int,翻车,public
From: https://blog.51cto.com/u_11702014/6459197

相关文章

  • 一场面试30多个题目,虚脱了!
    大家好,我是田哥最近这两年,因为受疫情影响,工作确实不好找。为了答谢你的关注,田哥整理最近7位朋友的面经,希望给正在准备面试或正在面试的你提供点小帮助。第一位朋友在杭州面试一家小厂,面经如下:1.项目介绍2.springboot和springMVC3.Spring和SpringBoot区别4.AOP动态代理5.......
  • 1009道面试题,想刷完,要多久?
    我的面试题网站,目前已更新到1009题了,今天对所有题目做一个汇总(后续还会继续优化,继续完善):Redis的数据类型有哪些?请简述一下JVM的内存模型说说堆和栈的区别说说你对CAP的理解你知道哪些分布式事务解决方案?什么是二阶段提交?什么是HTTP?HTTP的作用是什么?说说HTTP的优点和缺点什么是长......
  • 年后面试,给你提6点建议!
    你好,我是田哥转眼年底,很大部分人都在观望,甚至已经开始着手准备明年的面试了,不知道屏幕前的你是如何打算的?从现在开始,到明年三月份还有两个多月的时间,时间不多,但也不少了。只要自己好好准备,明年肯定有收获的。如何准备,准备哪些?我给你总结了6个方面:简历问题自我介绍问题项目介绍问题......
  • 第一次面试,面完,直接拒了!
    你好,我是田哥这是一位东北黑龙江同学的面经,也是他人生第一次面试经历。来看看他面试遇到了些什么问题,然后,你也可以先看看题目,看看自己能回答上来多少。面试问题1.自我介绍(就说了来自哪,想找java)(停顿一会儿)2.说一下你对java的了解?(大声)3.你对java锁机制了解多少。4.说一下单例模式5.M......
  • XML代码的编写(一)
    XML代码的编写(一)XML概念Extensible Markup Language,翻译过来为可扩展标记语言。Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范。学习XML的目的在现实生活中大量存在有关系的数据,如下图所示  这样的数据如何交给计算机处理呢?,XML语言......
  • JavaWeb开发与代码的编写(十八)
    JavaWeb开发与代码的编写(十八)Filter(过滤器)Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控......
  • java刷题网站最近更新的面试题
    49个人中至少几个人生日是同一月?如何用3升和5升桶量取4升水?JVM逃逸分析默认是开启还是关闭?ZGC有缺点吗?JVM对Java的原生锁做了哪些优化?为什么wait(),notify()和notifyAll()必须在同步方法或者同步块中被调用?什么是锁消除和锁粗化?为什么代码会重排序?什么是自旋?你们线程池是怎......
  • 帝国CMS如何设置屏蔽页代码
    情景描述:当我们不想让用户直接看到真正的内容时候,但又不让蜘蛛发觉,以致快照更改,所以需要用到屏蔽页,这样既能兼顾用户浏览的需求,也能兼顾到蜘蛛,不至于快照被篡改的情况。步骤:1.制作一个txt文本文件,填充假页面代码,(注意,保存文件格式一定是txt文档)如下:<!DOCTYPEhtml><htmllang=......
  • ES6代码暴露的三种方式
    JS模块化主要有CommenJS(node)、JSmodule(es6)。一、CommenJSCommenJS主要是node环境中用于模块化开发,每一个js文件都是一个模块,有自己的作用域,其中的变量和函数都是私有的,对外部js文件不可见。使用module.exports或exports关键字进行对外暴露,*可以在普通的js文件中使用*1......
  • C++面试八股文:在C++中,你知道哪些运算符?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:面试官:在C++中,你都知道都哪些运算符?二师兄:啥?运算符?+-*/=这些算吗?面试官:嗯,还有其他的吗?二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。面试官:好的。那你知道这些运算的优先级吗?二师兄:(面试官傻逼吧,这谁记得住)记不住......