去某大厂面试,却被逻辑运算符给“算计”了,网友:我想哭~

简介: 最近,鸭哥的一位读者被某大厂邀请去面试,他本不打算去的,但,我告诉他,“你不去试一下,你永远不知道你到达了什么段位?”


因此,他才鼓足勇气,决定拼死一战。然而,一面中,却被逻辑运算符给“算计”了~


到底是怎么样的一到题呢?让我慢慢来给他和在坐的小伙伴分析一下。


说实话,这是一份笔试题中的一道选择题,他当时选错了,记忆犹新。后来,他跟这个面试官互加了微信,了解了一下,他们公司专门有一个面试题库,会随机从题库里面,取几道题来,来考查应聘者的基础知识。


好了,切入正题。


# 面试题


先来看面试题,如下:


public class Test{   
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);   
           }
  }

上面程序的输出结果为:


A. 432 B. 531 C. 421 D. 523

来来来,先选择你心目中的答案,后面揭晓。


# 考查知识点


首先,我们应该明确题目涉及的知识点,显然,上面的题目考察的是逻辑运算符的知识。

image.png


提到逻辑运算符,我们首先想到的是  `&&` 和 `||` ,即逻辑与和逻辑或,同时不要忘了 逻辑非 `!` 。这三个逻辑运算符,逻辑与和逻辑或是二元运算符(所谓的二元运算,是指对两个操作数进行运算),而逻辑非则是一元运算符。 


关于 `&&` 和 `||` ,一个常见的疑问或者考点就是,一个表达式是否是短路(short-circuits)的。如果由左端表达式可推算出整个表达式的值,我们称为“短路”,始终执行逻辑运算符两边的表达式称为“非短路”。逻辑与和逻辑或构成的表达式是否具有短路特性呢?我们可以用实例验证。


//需要验证的内容如下:
if(a && b)    //如果 a 为 false, Java还会校验 b 吗?
if(a || b)    //如果 a 为 true, Java还会校验 b 吗?

鸭哥应该给大家讲清楚了吧!


# 实践出真知


受文章开头题目的设计思路启发,我们可以用下面的例子验证逻辑与和逻辑或运算符的特性:


public class FunnyTest{
    public static void main(String[] args){
        int a = 0;
        int b = 0;
        if((a++ > 0) && (b++ > 0)) ;  
        System.out.println("如果结果为1 0,则逻辑与具有短路特性:" + a +" " + b);
        //此时a = 1, b = 0
        if((a++ > 0) || (b++ > 0)) ;
        System.out.println("如果结果为2 0,则逻辑或具有短路特性:" + a +" " + b);
           }
        }

程序的运行结果为:


image.png


分析:


a, b 的初始值均为 0,


第一个 if 条件执行后, a 的值加 1 ,b 的值不变,说明当 Java 执行 `a++ > 0` 的结果为 `false` 后,整个表达式即为 `false`,不再验证 `b++ > 0` 的值;


第二个 if 条件也是同样的道理,a = 1,  `a++ > 0` 为 `true` ,整个表达式为 `true` ,不再验证 `b++ > 0` 的值。


所以,`&&` 和 `||`组成的表达式都具有短路特性


# 回归题目


回到文章开头的题目,模拟程序的执行过程如下:


当z=0,执行++x > 2不成立, &&后面不执行,此时 x=1,y=0,k=0;


当z=1,执行++x > 2不成立, &&后面不执行,此时 x=2,y=0,k=0;


当z=2, 执行++x > 2成立, 继续执行 ++y > 2不成立 , &&后面不执行, 此时 x=3,y=1,k=0;


当z=3,执行++x > 2成立,继续执行++y > 2不成立 , &&后面不执行, 此时 x=4,y=2,k=0;


当z=4,执行++x > 2成立,继续执行 ++y > 2成立 , 继续执行k++>2 ,不成立,此时 x=5,y=3,k=1;


(注意:5次循环都没有满足if条件)


当z=5,不满足条件for循环条件,跳出循环。


打印结果:x=5, y = 3, k = 1。所以,正确答案为 B ,你答对了吗?



# 引申思考


我们平时工作,很多场景其实都利用了 `&&` 和 `||` 运算符的短路特性,比如字符串的判断及后续处理:


我们可以这样写:


if (str != null && !str.isEmpty()) {
   doSomethingWith(str);
 }


也可以这么写:


if (str == null || str.isEmpty()) {
    unusableString();
} else { 
   doSomethingWith(str);
 }

如果没有短路特性,上述写法是会报异常的。因为若str = null ,执行 str.isEmpty() 时将会报NullPointerException。也就是说,上述两种写法,&& 和 || 左右两侧表达式的顺序不能互换,必须先判断 str 是否为 null , 再执行str.isEmpty().。


这个知识点,你get到了吗?你工作中,因为逻辑运算符踩过什么坑?欢迎在评论区与大家分享!

相关文章
|
架构师 Java 程序员
程序员懊恼面试被屡次遭拒,网友:38岁了心里没点逼数吗?
程序员面试的三道坎,学历、工作经验、年龄。前两者倒也还好,而年龄这个标准始终是程序员们卡在喉咙上的一根刺,不知何时会突然扎穿喉咙,了断性命。现在互联网行业日益趋近年轻化,许多企业对于程序员的年龄标准大约在35岁左右(参考华为35岁离职),若是38岁去求职,结果可想而知! 这名程序员38岁了,找工作本就难,还是大专学历,更是难上加难,网友表示:楼主38岁工作经验定然丰富,不知之前是否有在大公司工作过没,若是有可以给自己的简历添几笔加分,机会也会多一点。
1294 0
|
机器学习/深度学习 Java 应用服务中间件
程序员吐槽自己阿里p7面试微软被拒,网友:你就是高级一点的码农
我想一提起阿里巴巴,我们就互相到马云这位大佬。然而阿里巴巴也是我国巨头企业霸主之一,在国际上也十分具有知名度。众所周知阿里员工的待遇和福利是非常优渥的,因此也吸引了很多年轻人的目光。但是阿里和国际知名企业如谷歌、微软等相较于技术来说还是有着一定的差距。
1503 0
|
Java 程序员
程序员跳槽面试看见公司老大也来面试,网友:老大比你更尴尬
程序员跳槽已经成了重要的一个话题,只有极少的一部分的程序员才会在一家公司呆上10年以上,更多的程序员把腾讯、阿里这样的互联网大型公司当成职业生涯的目标 所以发生了下面的场景,一个程序员去阿里面试,既然在休息室遇到老大,他也来面试。
1387 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
22天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
50 2
|
26天前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
24 0
|
3月前
|
Java C++
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
这篇文章讨论了Java单继承的设计原因,指出Java不支持多继承主要是为了避免方法名冲突等混淆问题,尽管Java类不能直接继承多个父类,但可以通过接口和继承链实现类似多继承的效果。
【Java基础面试十七】、Java为什么是单继承,为什么不能多继承?
|
3月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
3月前
|
Java
【Java基础面试三十七】、说一说Java的异常机制
这篇文章介绍了Java异常机制的三个主要方面:异常处理(使用try、catch、finally语句)、抛出异常(使用throw和throws关键字)、以及异常跟踪栈(异常传播和程序终止时的栈信息输出)。
|
3月前
|
Java
【Java基础面试三十八】、请介绍Java的异常接口
这篇文章介绍了Java的异常体系结构,主要讲述了Throwable作为异常的顶层父类,以及其子类Error和Exception的区别和处理方式。