Вопрос

У меня есть коллега, который утверждает, что раньше значение TRUE определялось как 0, а все остальные значения были FALSE.Я мог бы поклясться, что на каждом языке, с которым я работал, если бы вы могли даже получить значение для логического значения, значение FALSE равно 0.Раньше значение TRUE было равно 0?Если да, то когда мы поменялись местами?

Это было полезно?

Решение

0 / не-0, что смущает вашего коллегу, вероятно, относится к тому, когда люди используют числовые значения в качестве возвращаемого значения, указывающего на успех, а не на истину (т. Е.в скриптах bash и некоторых стилях C /C++).

Использование 0 = success позволяет с гораздо большей точностью указывать причины сбоя (например,1 = отсутствующий файл, 2 = отсутствующая конечность и так далее).

В качестве дополнительного примечания:в Ruby единственными значениями false являются nil и false.0 - это истина, но не в отличие от других чисел.0 имеет значение true, потому что это экземпляр объекта 0.

Другие советы

Это может быть ссылка на результирующий код, равный 0, который в большинстве случаев после запуска процесса результирующий код, равный 0, означает: "Эй, все работало нормально, никаких проблем".

Я работал в компании с большим количеством старого кода на языке Си.Некоторые из общих заголовков определяли свои собственные значения для TRUE и FALSE, а некоторые действительно имели значение TRUE как 0 и FALSE как 1.Это привело к "войнам за правду".:

/* like my constants better */
#undef TRUE
#define TRUE 1

#undef FALSE
#define FALSE 0

Если ничего другого нет, оболочки bash по-прежнему используют 0 для true и 1 для false.

Несколько функций в стандартной библиотеке C возвращают целое число "код ошибки" в качестве результата.Поскольку noErr определяется как 0, быстрой проверкой может быть "если это 0, то все в порядке".То же соглашение применяется к "коду результата" процесса Unix;то есть целое число, которое давало некоторое представление о том, как завершился данный процесс.

В сценариях командной оболочки Unix доступен результирующий код только что выполненной команды, который обычно используется для обозначения того, "удалась" команда или нет, причем 0 означает успех, а все остальное - конкретное условие невыполнения.

Исходя из этого, все тестоподобные конструкции в сценариях оболочки используют 'success' (то есть код результата, равный 0) для обозначения TRUE, а все остальное - для обозначения FALSE.

На совершенно другом уровне цифровые схемы часто используют "отрицательную логику".то есть, даже если 0 вольт называется "двоичным 0", а некоторое положительное значение (обычно + 5 В или + 3,3 В, но в настоящее время нередко используется + 1,8 В) называется "двоичным 1", некоторые события "подтверждаются" данным выводом, равным 0.Я думаю, что есть некоторые преимущества в шумоизоляции, но я не уверен в причинах.

Однако обратите внимание, что в этом нет ничего "древнего" или какого-то "времени переключения".Все, что я знаю об этом, основано на старых конвенциях, но абсолютно актуально сегодня.

Я не уверен, но я могу сказать вам вот что:приемы, основанные на лежащей в основе природе TRUE и FALSE, подвержены ошибкам, поскольку определение этих значений остается на усмотрение разработчика языка (или, по крайней мере, спецификатора).

Системные вызовы в стандартной библиотеке C обычно возвращают значение -1 при ошибке и 0 при успешном выполнении.Также оператор Fotran, вычисляемый if, будет (и, вероятно, все еще делает) переходить к одному из трех номеров строк в зависимости от условия, оцениваемого как меньшее, равное или большее нуля.

например:ЕСЛИ (I-15) 10,20,10

проверил бы условие перехода I == 15 к строке 20, если true (равно нулю), и к строке 10 в противном случае.

Сэм прав насчет проблем, связанных с опорой на конкретные знания деталей реализации.

Общее правило:

  1. Оболочки (включая DOS) используют "0" как "Нет Ошибки"...не обязательно это правда.

  2. Языки программирования используют ненулевое значение для обозначения значения true.

Тем не менее, если вы используете язык, который позволяет вам определять значение TRUE или FALSE, определите его и всегда используйте константы.

Даже сегодня в некоторых языках (Ruby, lisp, ...) 0 является истинным, потому что истинно все, кроме nil.Чаще всего верно значение 1.Это обычная ошибка, и поэтому иногда считается хорошей практикой не полагаться на то, что 0 равно false, а выполнять явный тест.Java требует, чтобы вы это сделали.

Вместо этого

int x;    
....
x = 0;
if (x)  // might be ambiguous
{
}

Make - это явный

if (0 != x)
{
}

Я помню, что выполнял некоторое программирование на VB в форме доступа, где True равнялось -1.

Я помню, что в PL / 1 не было логического класса.Вы могли бы создать бит и присвоить ему результат логического выражения.Затем, чтобы использовать его, вы должны были помнить, что 1 - это false, а 0 - это true.

По большей части значение false определяется как 0, а значение true ненулевое.Некоторые языки программирования используют 1, некоторые -1, а некоторые используют любое ненулевое значение.

Однако для оболочек Unix они используют противоположное соглашение.

Большинство команд, выполняемых в оболочке Unix, на самом деле являются небольшими программами.Они передают обратно код выхода, чтобы вы могли определить, прошла ли команда успешно (значение 0) или по какой-то причине произошел сбой (1 или более, в зависимости от типа сбоя).

Это используется в интерпретаторах оболочки sh / ksh / bash в командах if /while /until для проверки условий:

if command
then
   # successful
fi

Если команда выполнена успешно (т.е. возвращает нулевой код выхода), код внутри инструкции выполняется.Обычно используется команда [ command, которая является псевдонимом для тестовой команды.

Самое смешное, что это зависит от языка, с которым вы работаете.В Lua является true == нулевым внутренним показателем производительности..То же самое для многих системных вызовов в C.

Легко запутаться, когда операторы возврата true / false в bash работают наоборот:

$ false; echo $?
1
$ true; echo $?
0

Я слышал и использовал старые компиляторы, где true > 0 и false <= 0.

Это одна из причин, по которой вы не хотите использовать if (указатель) или if (число) для проверки на ноль, они могут неожиданно принять значение false.

Аналогично, я работал с системами, где NULL не был равен нулю.

В языке C, до C ++, не существовало такого понятия, как логическое значение.Условные обозначения были выполнены путем тестирования целых чисел.Ноль означал false, а любое ненулевое значение означало true.Чтобы вы могли написать

if (2) {
  alwaysDoThis();
} else {
  neverDothis();
}

К счастью, C ++ допускает выделенный логический тип.

На любом языке, на котором я когда-либо работал (возвращаясь к BASIC в конце 70-х), false считался равным 0, а true - ненулевым.

Я не могу вспомнить TRUE быть 0. 0 однако это то, что вернул бы программист на C, чтобы указать на успех.Это можно спутать с TRUE.

Это не всегда так 1 либо.Это может быть -1 или просто ненулевое значение.

Для языков без встроенного логического типа единственное соглашение, которое я видел, - это определять TRUE как 1, а FALSE как 0.Например, в C, if оператор выполнит предложение if, если условное выражение примет значение, отличное от 0.

Я даже однажды видел документ с рекомендациями по кодированию, в котором специально говорилось, что не следует переопределять TRUE и FALSE.:)

Если вы используете язык, который имеет встроенное логическое значение, например C ++, то ключевые слова true и false являются частью языка, и вы не должны полагаться на то, как они на самом деле реализованы.

В таких языках, как C, не было логического значения, поэтому вам пришлось определить свое собственное.Могли ли они работать с нестандартными переопределениями BOOL?

Коды DOS и выхода из приложений обычно используют 0 для обозначения успеха и ненулевые для обозначения сбоя определенного типа!

Коды ошибок DOS равны 0-255 и при тестировании с использованием синтаксиса 'errorlevel' означают все, что выше или включает указанное значение, поэтому следующее соответствует 2 и выше первому переходу, 1 второму и 0 (успех) последнему!

IF errorlevel 2 goto CRS
IF errorlevel 1 goto DLR
IF errorlevel 0 goto STR

Ядро базы данных SQL Server оптимизирует хранение битовых столбцов.Если в таблице есть 8 или менее разрядных столбцов, они хранятся в виде 1 байта.Если имеется от 9 до 16 битных столбцов, столбцы хранятся в виде 2 байт и так далее.Строковые значения TRUE и FALSE могут быть преобразованы в битовые значения:Значение TRUE преобразуется в 1, а значение FALSE - в 0.Преобразование в бит переводит любое ненулевое значение в 1.

В каждом языке 0 может быть равно true или false Поэтому перестаньте использовать число, используйте слова true Лол Или t и f память в 1 байт

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top