2008-09-19 4 views
21

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

ответ

25

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

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

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

8

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

+0

Я был немного этим раньше ... – 2017-08-29 14:55:10

20

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

+3

С обоснованием, что нет ничего, что можно сказать, если оно сработало, тогда как если оно не получилось, есть много ненулевых кодов возврата, чтобы указать, какой был отказ. – slim 2008-09-19 18:24:26

+0

ах ... хороший старый COM – MagicKat 2008-09-19 18:26:22

+1

И, следовательно, команда unix «true» ничего не делает, кроме кода возврата 0. – Justsalt 2008-09-19 18:28:57

0

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

3

Я не уверен, но могу сказать вам следующее: трюки, основанные на основополагающих свойствах ИСТИНА и ЛОЖЬ, подвержены ошибкам, потому что определение этих значений остается за разработчиком языка (или как минимум, спецификатор).

+0

ну, на языке, подобном perl, где есть свободное определение истины, это то, чему вы научитесь не только выделять, но и любить. Но в области безопасности типов большинства скомпилированных языков истинные и ложные в своих определениях довольно строгие. – stephenbayer 2008-09-19 18:25:35

+0

Да, но это становится потенциальной проблемой - даже на том же языке - если вы конвертируете между компиляторами, платформами или даже просто обновляете до последней версии своего языка. Вот почему я поддерживаю реализацию агностиком, если вы не уверены в своей платформе или вам нужно быть. – 2008-09-19 18:30:02

0

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

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

0

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

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

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

+0

Я считаю, что ключевые слова true и false имеют значения, указанные стандартом, поэтому вы можете положиться на них. – 2008-09-19 20:21:22

+1

Несколько языков, включая более старые версии VB, определяют true/false как -1/0. Это значит, что побитовые операции и логические операции выполняют одно и то же. – user11318 2008-09-19 23:50:24

1

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

Вместо этого

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

Марка явно

if (0 != x) 
{ 
} 
+0

Технически в Java, если утверждения действительны только для булевых выражений, а целые числа не передаются в booleans. В Java true - true, а false - false, и ни один из них не является числом. – 2009-09-29 21:23:51

1

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

0

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

2

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

например: IF (I-15) 10,20,10

бы проверить состояние I == 15 прыжков на линию 20, если оно истинно (принимает значение ноль) и строка 10 в противном случае.

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

1

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

4

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

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

Исходя из этого, все тестовые конструкции в сценариях оболочки используют «успех» (то есть код результата 0) для обозначения ИСТИНА, а что-то еще, что означает FALSE.

На совершенно другой плоскости цифровые схемы часто используют «отрицательную логику». то есть даже если 0 вольт называется «двоичным 0», а некоторое положительное значение (обычно + 5v или + 3.3v, но в настоящее время это редко встречается + 1.8v) называется «двоичным 1», некоторые события «утверждены», по данному штырю, идущему на 0. Я думаю, что есть некоторые помехоустойчивые преимущества, но я не уверен в причинах.

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

0

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

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

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

Легко запутаться, когда истинные/ложные утверждения возврата Баш являются наоборот:

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

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

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

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

Это используется в ш/КШ переводчиках/Баш оболочки в пределах, если/тогда/до тех пор команды, чтобы проверить условие:

if command 
then 
    # successful 
fi

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

2

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

  1. Корпуса (DOS включены) использовать "0", как "No Error" ... не всегда верно.

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

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

1

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

1

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

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

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

0

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

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

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

12

Я работал в компании с большим количеством старого кода С. Некоторые из общих заголовков определили свои собственные значения ИСТИНА и ЛОЖЬ, и некоторые действительно имеют значение TRUE как 0 и FALSE как 1. Это привело к «правду войны»:

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

#undef FALSE 
#define FALSE 0 
0

Сервер SQL Database Engine оптимизирует хранение бит. Если в таблице есть 8 или менее столбцов, столбцы хранятся как 1 байт. Если имеется от 9 до 16 бит столбцов, столбцы хранятся как 2 байта и так далее. Строковые значения ИСТИНА и ЛОЖЬ могут быть преобразованы в битовые значения: TRUE, преобразуется в 1 и FALSE преобразуется в 0. Преобразование бит способствует любое ненулевое значение 1.

Каждый язык может иметь 0 истинным или ложным Итак, прекратите использовать число, используя слова true Lol Или t и f 1 байт-хранилище

Смежные вопросы