博客
关于我
java面试题之++i与i++与运算符优先的问题
阅读量:394 次
发布时间:2019-03-05

本文共 2733 字,大约阅读时间需要 9 分钟。

写在前面的话

java程序员这一行,只有不断的学习和进步,才能在现在竞争越来越激烈的市场环境生存下来,而对于我们来说基础就更为重要了。扎扎实实地打好基础,练好基本功,我认为这是学好java的“秘诀”。最近去参加面试,遇到常见的自增变量相关的面试题还是比较多的,特地记录一下。

面试题

首先面试题目是这样的:

public static void main(String[] args) {           int i = 1;        int j = i++;        int k = i + ++i * i++;        System.out.println("i=" + i + ",j=" + j + ",k=" + k);    }

运行结果:

在这里插入图片描述
看似十分简单的一个题目,但是得出的结论却出乎我们的意料,为什么呢?这道题目实际上涉及到了几个知识点,下面一个个说明。

分析过程

  • int i = 1
    首先这个就是简单的一个赋值操作,即在栈中给i分配了一个值1,这也没什么好说的,挺简单的一个赋值操作。
  • int j = i++
    这个就要特地注意++运算符的问题,比如i++++i的赋值和自增操作先后的问题。
    如果是int j=i++,则是先将i的值赋给j,所以这里j=1,然后i自增加1,所以i=2。
  • int k = i + ++i * i++
    这里这块运算需要小心一点啦,不然很容易出错,特地需要注意是++ii++,刚刚入门小白的时候很容易把这俩运算过程给整混淆,只需牢牢记住++在前:先自增然后在做运算,++在后先做运算在自增的秘诀即可。所以这里最开始i=2,++i这里是i先自增1就变成了3,然后这个值乘以i++,而i++首先是先做运算,即前面乘以的是3,然后i自增为4。综上所述:k=2+3*3=11,i=4。

经典升级配合&&

public static void main(String[] args) {           int x = 0;        int y = 0;        int k = 0;        for (int z = 0; z < 5; z++) {               if ((++x > 2) && (++y > 2) && (k++ > 2)) {                   x++;                ++y;                k++;            }        }        System.out.println(x + "," + y + "," + k);    }

这里面考察了++运算符执行的过程,以及&&操作运算法的执行过程。

分析过程

首先最总要的就是上面一个判断3个&&的问题,只有一个个条件满足了才会执行后面的计算操作,其次就是++运算符的运算问题。下面for循环一共循环了5次,让我们分析一下x,y,z的值的变化。注意++在前:先自增然后在做运算,++在后先做运算在自增这个秘诀就可以轻松面对此面试题。

  • z=0
    当循环第一次的时候,x自增后的值为1不满足大于2,所以if语句里面的代码块并没有执行,此x=1,y=0,k=0。
  • z=1
    循环第二次的时候,x自增后的值为2不满足大于2,所以同样if语句里面的代码没有执行,此时x=2,y=0,z=0。
  • z=2
    循环第三次的时候,x自增后的值为3大于2,满足第一个判断条件,所以会执行(++y > 2)这个判断,y自增后的值为1不满足大于2条件。此时x=3,y=1,k=0。
  • z=3
    循环第四次的时候,x自增的后的值为4大于2,满足第一个判断条件,执行(++y > 2)判断,y自增后的值为2,不满足大于2的条件,此时的x=4,y=2,k=0。
    -z=4
    循环最后一次的时候,此时x自增5大于2,y自增后的值3大于2,执行(k++ > 2)判断,此时k=0,不满足大于2,然后k在自增1。
    所以上面最终输出的结果是:
    在这里插入图片描述

运算符优先问题

public static void main(String[] args) {           int x = 10;        int y = 10;        System.out.println("x+y="+x+y);        System.out.println("x*y="+x*y);        System.out.println("x/y="+x/y);    }

第一个打印:x+y=1010 ,第二个打印x*y=100,第三个打印x/y=1;

本人在各大公司都会遇到上面++自增变量的问题,特地分享3道经典面试题,这是javaSe一大经典的一个考点。

i++所遇到的坑

之前在刷面试题也遇到一个坑,代码如下:

@Test    public void testCount() {           int count = 0;        int y =0;        for (int i = 1; i <= 10; i++) {               y = count++;        }        System.out.println(y);    }

聪明的你肯定知道这个输出是9,如果我们将代码这样改呢?

@Test    public void testCount() {           int count = 0;        int y =0;        for (int i = 1; i <= 10; i++) {               count = count++;        }        System.out.println(count);    }

这次输出还是9吗?but运行后发现结果是为0。咋回事呢?其实dubug后发现每次循环count 的值都是为0,查阅相关资料总结如下:

  1. 循环的时候首先把count的值(注意是值,不是引用)拷贝到一个临时变量区。
  2. 然后对count变量加1。
  3. 返回临时变量区的值,注意这个值是0,没修改过。

所以每次循环最后返回的值都是0,最终结果当然就是0了,上面过程count = count++;可以用下面代码解释方便进行理解。

public static void change(int count) {          count++;    }

所以每次修改后,相当于在新的内存区间进行操作并没有赋值给原来的变量,所以每次操作后原来的值都是为0。

转载地址:http://ngnwz.baihongyu.com/

你可能感兴趣的文章
Nacos入门过程的坑--获取不到配置的值
查看>>
Nacos原理
查看>>
Nacos发布0.5.0版本,轻松玩转动态 DNS 服务
查看>>
Nacos启动异常
查看>>
Nacos命名空间配置_每个人用各自自己的命名空间---SpringCloud Alibaba_若依微服务框架改造---工作笔记001
查看>>
Nacos和Zookeeper对比
查看>>
Nacos在双击startup.cmd启动时提示:Unable to start embedded Tomcat
查看>>
Nacos基础版 从入门到精通
查看>>
Nacos如何实现Raft算法与Raft协议原理详解
查看>>
Nacos安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(上)
查看>>
Nacos实战攻略:从入门到精通,全面掌握服务治理与配置管理!(下)
查看>>
Nacos心跳机制实现快速上下线
查看>>
nacos报错com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
查看>>
nacos服务提供和发现及客户端负载均衡配置
查看>>
Nacos服务注册与发现demo
查看>>
Nacos服务注册与发现的2种实现方法!
查看>>
nacos服务注册和发现原理简单实现案例
查看>>
Nacos服务注册总流程(源码分析)
查看>>
nacos服务注册流程
查看>>