哈喽,大家好,我是明智
又到周五了,周五咱们聊一些稍微简单一点的问题:i >= j && i <= j && i != j
这个表达式可以成立吗?
这看起来是一个不可能成立的表达式,不过在程序员的世界里,它却是可以成立的,且听我细细道来

咱们先来看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);
}
此时,i
和 j
是两个不同的 Integer
对象,即使它们的值相同。因此,进行下面的比较时会出现不同的结果:
i >= j
: 这个条件会成立,因为 Java 会在比较时将Integer
对象拆箱为基本类型int
,所以i >= j
实际上是1 >= 1
,结果为true
。i <= j
: 同理,这个条件也会成立,因为1 <= 1
是true
。i != j
: 这个条件也会成立,因为i
和j
是不同的对象,引用不同,因此i != j
是true
。
程序员的世界里,就是这么滴神奇!
不只是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++中没有这个机制,不过我们可以通过指针跟解指针达到类似的目的
int* i = new int(1);
和int* j = new int(1);
动态分配了两个不同的int
对象,且值都为1
。*i >= *j
: 解引用指针进行值比较,结果为true
,因为1 >= 1
。*i <= *j
: 解引用指针进行值比较,结果为true
,因为1 <= 1
。i != j
: 比较指针地址,结果为true
,因为i
和j
是两个不同的对象,指针地址不同。
同理在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)
看到这里,恭喜你,又学会一个没有什么卵用的知识点!

作者简介:
大三退学,创业、求职、自考,一路升级
7年it从业经验,多个开源社区contributor
专注分享成长路上的所悟所得
长期探索
个人成长
|职业发展
|副业探索
推荐阅读: