В чем разница между инструкцией байт-кода, которая позволяет одному языку поддерживать предварительную нулевую проверку внутри, если управление потоком, а другой нет? - PullRequest
0 голосов
/ 27 октября 2019

почему 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");
    }
}

Ошибка: (5, 12) java: несовместимые типы: невозможно преобразовать в логическое значение

из https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

enter image description here

java и c ++ это просто пример, Lua и js также поддерживают это, а kotlin не
Я пытаюсь понять, почему один язык поддерживает нулевую проверку по умолчанию, а другой нет?

Ответы [ 2 ]

3 голосов
/ 27 октября 2019

Это разные языки, и разные языки могут иметь разную семантику! В 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.

1 голос
/ 27 октября 2019

В C ++ любое числовое значение будет приведено к логическому значению, при этом 0 будет false, а все остальное - true, а null - это значение 0.

В Javaничего не приводит к логическому значению, это ошибка времени компиляции, если значение не равно boolean или Boolean.

, потому что так были спроектированы языки.

...