gpt4 book ai didi

java - 使一种语言在流控制和另一种语言中不支持原始空检查的字节码指令之间有什么区别?

转载 作者:行者123 更新时间:2023-11-27 22:33:00 24 4
gpt4 key购买 nike

为什么c++支持这个

int main()
{
if(NULL)
std::cout << "compile";
if(5)
std::cout << "compile";
if(4.78)
std::cout << "compile";
if("lala")
std::cout << "compile";
}

在java中

public class Test {
public static void main(String[] args) {
if(null) System.out.println("true");
}
}

Error:(5, 12) java: incompatible types: cannot be converted to boolean

来自 https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

enter image description here

java和c++这只是一个例子lua和js也支持这个而 Kotlin 不是
我想了解为什么一种语言默认支持 null 检查而另一种语言不支持?

最佳答案

它们是不同的语言,不同的语言可以有不同的语义!在 C 或 C++ 中,NULL 实际上只是一个预处理器宏,定义为 0 或定义为生成空指针的表达式 (((void* )0))。此外,C++(但不是 C!)带有一个空指针关键字(nullptr,自 C++11 起),现在应该优先于宏或整数文字 0.

然后在 C 和 C++ 中,您可以直接测试数字(整数或 float )和指针。比较等于 0 的任何内容都被接受为 false,其他任何内容都被接受为 true。例如:

int n = 0;
int* p = nullptr; // C++ only, 0 or NULL in C
double d = 0.0;

if(n) { }
if(p) { }
if(d) { }
// all of these are equivalent to if(x != 0), x being n, p or d

同样,您也可以测试文字(下面的所有内容实际上都不会进入 if 分支):

if(false) { }
if(0) { }
if(nullptr) { }

相比之下,Java 接受真 boolean 值。所以 C 或 C++ 中隐含的必须在 Java 中显式编写(可能还有 Lua,但我不熟悉):

if(someBoolean) { }        // fine, as boolean already
if(someInt != 0) { }
if(someReference != null) { }

旁注:还有一些其他语言也使用 C/C++ 语义,例如 Python 或 JavaScript。

关于java - 使一种语言在流控制和另一种语言中不支持原始空检查的字节码指令之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58577305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com