Подтвердить что ты не робот

В чем разница между false и FALSE?

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

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

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

4b9b3361

Ответ 1

Если вы включили windows.h, то FALSE #defined как 0. TRUE #defined как 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, либо возвращают значения такого типа. С++, будучи строго типизированным, может жаловаться, если вы принуждаете их к булевскому типу, определенному в стандарте языка. Для согласованности я использую старые идентификаторы во всех своих вызовах функций Windows API и ключевые слова TRUE и FALSE, которые теперь определены стандартом во всех методах, которые я пишу себе.

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

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

Ответ 2

FALSE не определен в стандарте. Только FALSE. true и FALSE называются "булевыми литтерами" (и являются ключевыми словами в С++).

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 никак не является привилегированным символом.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Не используйте FALSE. Как говорили другие, это макрос, оценивающий значение 0. Я слышал истории о людях, покидающих компанию и ставя (по назначению) #define FALSE 1 в случайных местах в кодовой базе. Верный способ нанести ущерб.

Придерживайтесь FALSE, поскольку он является частью стандарта С++.

Ответ 7

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

  bSomeVal != FALSE instead.