В чем разница между ложным и ложным? - PullRequest
20 голосов
/ 14 апреля 2011

Во многих программах я вижу операторы с идентификаторами FALSE и false.Есть ли разница между ними в контексте C ++?

Также в некоторых программах я видел bool и где-то BOOL.В чем разница между ними обоими?

Может кто-нибудь объяснить мне разницу между этими идентификаторами?Спасибо.

Ответы [ 6 ]

24 голосов
/ 14 апреля 2011

Если вы включили windows.h, то FALSE определяется как 0. TRUE определяется как 1. Это не логический тип, это целочисленный тип. Windows также определила тип BOOL, который на самом деле является целочисленным типом, предназначенным для размещения значений TRUE и FALSE.

Соответствующие разделы кода в windows.h выглядят примерно так:

#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0

#ifdef TRUE
#undef TRUE
#endif
#define TRUE  1

typedef int    BOOL,    *PBOOL,    *LPBOOL;

Windows изначально была написана на C, как и все оригинальные приложения Windows. В то время в C не было булева типа, определенного стандартом. Вместо этого разработчики были вынуждены определять свои собственные логические константы. Чтобы предотвратить возможную путаницу, Microsoft выбрала стандарт, который будет использоваться для всех приложений Windows.

Если вы пишете приложения для Windows, вам все равно может понадобиться использовать идентификаторы TRUE и FALSE. Некоторые из функций, определенных в windows.h, принимают булевы параметры (на самом деле целые числа!), Типизированные как BOOL, или возвращают значения такого типа. C ++, будучи строго типизированным, может жаловаться, если вы приведете их к булевому типу, определенному в стандарте языка. Для согласованности я использую старые идентификаторы во всех своих вызовах функций Windows API, а теперь ключевые слова true и false определены стандартом во всех методах, которые я пишу сам.

На самом деле нет причин не использовать FALSE, как это определено в windows.h. Но вы не должны определять его самостоятельно в проприетарном заголовочном файле, как уже упоминали другие, потому что нет гарантии, что определение останется неизменным со временем. Это может привести к некоторым довольно глупым ошибкам, тип которых может появиться в Daily WTF.

Ответ Мата является на 100% правильным, что ни TRUE, ни FALSE не определены стандартами C или C ++. Однако они строго определены API Windows и гарантированно не изменятся. Их использование не приведет к созданию действительно кроссплатформенного, строго совместимого со стандартами кода C ++, но это редко вызывает озабоченность при написании приложений для Windows, поскольку ни одна из них не вызовет другие функции в windows.h.

14 голосов
/ 14 апреля 2011

FALSE не определено в стандарте.Только false есть.true и false называются "логическими литералами" и являются ключевыми словами в C ++.

FALSE иногда определяется как макрос.Вы не можете полагаться на его присутствие в среде, соответствующей стандартам, поскольку она не является частью стандарта.

Другими словами, следующая программа действительна C++:

#include <iostream>

#define FALSE 1

int main()
{
    bool a = false;
    bool b = FALSE;
    std::cout << a << " " << b << std::endl;
    return 0;
}

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

2 голосов
/ 14 апреля 2011

в C ++, false - это встроенный литерал типа boolean, представляющий ложное значение (другое возможное значение представлено литералом true )

FALSE - это #define, определение которого может зависеть от платформы, но обычно оно равно 0.

1 голос
/ 22 декабря 2011

Просто помните, что всегда значат истинные и ложные логические значения.Они всегда будут целыми числами (0,1).Компилятор может не распознать его, но он всегда будет храниться и проходить через ЦП как целые числа.Отладчик покажет это.Находится ли он заглавными буквами или нет, на самом деле не имеет значения, потому что не должно быть никаких различий в его реализации или использовании.Если у вашего компилятора есть несколько макросов, написанных для поддержки прописных и строчных букв true и false, то это здорово, но это просто для ваших нужд.Как и все остальные типы.

1 голос
/ 14 апреля 2011

false - ключевое слово C ++.

FALSE не определяется стандартом C ++. Но большинство компиляторов имеют FALSE, определенную как макрос препроцессора со значением 0.

0 голосов
/ 22 мая 2012

Важное замечание по Windows API: некоторые функции библиотеки WIndows возвращают произвольные целочисленные значения, хотя тип возвращаемого значения определяется как BOOL.Лучше никогда не сравнивать BOOL с TRUE.используйте

  bSomeVal != FALSE instead.
...