Почему логическое в Java принимает только истину или ложь? Почему не 1 или 0 тоже? - PullRequest
43 голосов
/ 06 января 2010

Есть ли какая-то причина, по которой Java-булевы принимают только true или false, почему не 1 или 0 также?

Ответы [ 8 ]

46 голосов
/ 06 января 2010

Java, в отличие от языков, таких как C и C ++, обрабатывает boolean как совершенно отдельный тип данных, который имеет 2 различных значения: true и false. Значения 1 и 0 имеют тип int и неявно преобразуются в boolean.

29 голосов
/ 06 января 2010

Поскольку логические значения имеют два значения: true или false. Обратите внимание, что это не строки, а фактические логические литералы.

1 и 0 являются целыми числами, и нет смысла путать вещи, делая их «альтернативным истинным» и «альтернативным ложным» (или наоборот, для тех, которые используются в кодах выхода Unix?). При строгой типизации в Java всегда должно быть только два примитивных логических значения.

РЕДАКТИРОВАТЬ: обратите внимание, что вы можете легко написать функцию преобразования, если вы хотите:

public static boolean intToBool(int input)
{
   if (input < 0 || input > 1)
   {
      throw new IllegalArgumentException("input must be 0 or 1");
   }

   // Note we designate 1 as true and 0 as false though some may disagree
   return input == 1;
}

Хотя я бы не рекомендовал это. Обратите внимание, что вы не можете гарантировать, что переменная int действительно равна 0 или 1; и нет 100% очевидной семантики того, что означает истина. С другой стороны, переменная boolean равна , всегда , либо true, либо false, и очевидно, что из них имеет значение true. : -)

Таким образом, вместо функции преобразования, привыкните к использованию boolean переменных для всего, что представляет собой концепцию истинного / ложного. Если вы должны использовать какую-то примитивную текстовую строку (например, для хранения в плоском файле), «истина» и «ложь» намного понятнее по смыслу и могут быть немедленно превращены в логическое значение с помощью библиотечного метода Логическое .valueOf .

17 голосов
/ 06 января 2010

Поскольку люди, создавшие Java, хотели, чтобы логическое значение однозначно означало true или false, а не 1 или 0.

Среди языков нет единого мнения о том, как 1 и 0 конвертируются в булевы. C использует 1, чтобы означать истину, и 0, чтобы означать ложь, но некоторые оболочки UNIX делают обратное. Использование ints ослабляет проверку типов, может быть передано целочисленное значение, кроме 1 или 0, и компилятор не сможет защититься от него.

16 голосов
/ 15 мая 2012

Одна вещь, на которую другие ответы не указали, состоит в том, что одно из преимуществ не рассматривать целые числа как значения истинности состоит в том, что это позволяет избежать синдрома ошибки C / C ++:

int i = 0;
if (i = 1) {
    print("the sky is falling!\n");
} 

В C / C ++ ошибочное использование = вместо == приводит к тому, что условие неожиданно оценивается как "true" и обновляется i как случайный побочный эффект.

В Java это ошибка компиляции, потому что значение присвоения i = 1 имеет тип int, и в этой точке требуется boolean. Единственный случай, когда вы столкнетесь с проблемами в Java, это если вы напишете хромой код, подобный этому:

boolean ok = false;
if (ok = true) {  // bug and lame style
    print("the sky is falling!\n");
}

... который любой с унцией "хорошего вкуса" написал бы как ...

boolean ok = false;
if (ok) {
    print("the sky is falling!\n");
}
3 голосов
/ 06 января 2010

На заметку по теме: компилятор Java использует int для представления логического , поскольку JVM имеет ограниченную поддержку логического типа. См. Раздел 3.3.4 Логический тип .

В JVM целое ноль представляет false , а любое ненулевое целое представляет true (Источник: Внутри виртуальной машины Java , Билл Веннерс)

3 голосов
/ 06 января 2010

Конкретность в этом отношении удерживает вас от целого ИСТИНЫ в VB - это -1, а в других языках истинное значение - просто НЕ НОЛЬ. Сохранение логического поля как true или false оставляет java вне этого аргумента.

1 голос
/ 10 февраля 2019

Несмотря на то, что в C ++ существует тип данных bool (сокращение от логического). Но в C ++ любое ненулевое значение является значением true , включая отрицательные числа. 0 (ноль) рассматривается как false . Где, как и в JAVA, существует отдельный тип данных boolean для true и false .

0 голосов
/ 09 мая 2017

В c и C ++ нет типа данных с именем BOOLEAN Вот почему он использует 1 и 0 в качестве истинного ложного значения. а в JAVA 1 и 0 считаются типом INTEGER, поэтому он вызывает ошибку в Java. И у java есть свои собственные логические значения true и false с логическим типом данных.

?? счастливого программирования ..?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...