阿里面试:i>=j&i<=j&i!=j可以成立吗?

哈喽,大家好,我是明智

又到周五了,周五咱们聊一些稍微简单一点的问题:i >= j && i <= j && i != j这个表达式可以成立吗?

这看起来是一个不可能成立的表达式,不过在程序员的世界里,它却是可以成立的,且听我细细道来

ce035a8a6ed1dea2878b817a098114e9.jpeg

咱们先来看java中的一段代码:

public static void main(String[] args) throws Exception {
    Integer i = new Integer(1);
    Integer j = new Integer(1);
    boolean match = i>=j && i<=j && i!=j;
    System.out.println(match);
}

此时,ij 是两个不同的 Integer 对象,即使它们的值相同。因此,进行下面的比较时会出现不同的结果:

  1. i >= j: 这个条件会成立,因为 Java 会在比较时将 Integer 对象拆箱为基本类型 int,所以 i >= j 实际上是 1 >= 1,结果为 true

  2. i <= j: 同理,这个条件也会成立,因为 1 <= 1true

  3. i != j: 这个条件也会成立,因为 ij 是不同的对象,引用不同,因此 i != jtrue

程序员的世界里,就是这么滴神奇!

不只是java,在其它语言也有类似的机制,在C++中,咱们利用指针也可以写出类似的代码:

int main() {
    int* i = new int(1);
    int* j = new int(1);

    // 比较操作
    bool result = (*i >= *j) & (*i <= *j) & (i != j);
    std::cout << "Result: " << result << std::endl;
}

在进行>=<=运算时,java中有自动拆箱机制,会比较实际的值。C++中没有这个机制,不过我们可以通过指针跟解指针达到类似的目的

  1. int* i = new int(1);int* j = new int(1); 动态分配了两个不同的int对象,且值都为1

  2. *i >= *j: 解引用指针进行值比较,结果为true,因为 1 >= 1

  3. *i <= *j: 解引用指针进行值比较,结果为true,因为 1 <= 1

  4. i != j: 比较指针地址,结果为true,因为ij是两个不同的对象,指针地址不同。

同理在python、go中,也有类似的机制存在,这里我就不一一解释了,直接给出代码:

GO:

func main() {
    i := new(int)
    j := new(int)
    *i = 1
    *j = 1

    // 比较操作
    result := (*i >= *j) && (*i <= *j) && (i != j)
    fmt.Println("Result:", result)
}

Python:

i = int(1)
j = int(1)

result = (i >= j) and (i <= j) and (i is not j)
print("Result:", result)

看到这里,恭喜你,又学会一个没有什么卵用的知识点!

766698dc793721ad801ed7905ca5ecd3.jpeg

作者简介

  1. 大三退学,创业、求职、自考,一路升级

  2. 7年it从业经验,多个开源社区contributor

  3. 专注分享成长路上的所悟所得

  4. 长期探索 个人成长职业发展副业探索

推荐阅读

美团一面问我i++跟++i的区别是什么

美团一面,你碰到过CPU 100%的情况吗?你是怎么处理的?

美团一面:碰到过OOM吗?你是怎么处理的?

美团一面,发生OOM了,程序还能继续运行吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值