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

What is the diffrrent between Bytecode Instruction that makes one language support premitive null check inside if flow control and the other not?

为什么 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

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

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

然后在C和C++中,你可以直接测试数字(整数或浮点数)和指针。任何比较等于 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,相比之下,接受真布尔值。所以C或C++中隐含的必须显式写在Java中(也可能是Lua,但我不熟悉):

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

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

在 C++ 中,任何数值都将被强制转换为布尔值,0false,其他为 truenull0值。

在 Java 中,没有任何内容强制转换为布尔值,如果值不是 booleanBoolean.

,则会出现编译时错误

因为这就是语言的设计方式。