前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试考代码,居然翻车了!

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

作者头像
田维常
发布2022-11-25 15:21:29
2740
发布2022-11-25 15:21:29
举报

你好,我是田哥

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

代码语言:javascript
复制
/**
 * @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);
    }
}

问:这段代码输出多少?

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

代码语言:javascript
复制
/**
 * @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);
    }
}

又问:那这段代码呢?

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

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

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

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

代码语言:javascript
复制
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代码表示如下:

代码语言:javascript
复制
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++之类的操作,切勿犯类似的错误哈。

好了,今天就分享这么点点小知识。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么输出0呢?
  • 解决办法
  • 提醒
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档