Всегда ли ИСТИНА имела ненулевое значение? - PullRequest
21 голосов
/ 19 сентября 2008

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

Ответы [ 22 ]

27 голосов
/ 19 сентября 2008

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

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

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

20 голосов
/ 19 сентября 2008

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

12 голосов
/ 22 сентября 2008

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

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

#undef FALSE
#define FALSE 0
8 голосов
/ 19 сентября 2008

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

4 голосов
/ 19 сентября 2008

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

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

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

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

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

3 голосов
/ 19 сентября 2008

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

2 голосов
/ 19 сентября 2008

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

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

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

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

2 голосов
/ 19 сентября 2008

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

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

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

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

1 голос
/ 19 сентября 2008

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

1 голос
/ 19 сентября 2008

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

Вместо этого

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

Марка явная

if (0 != x)
{
}
...