В плюсах любое положительное число равно true.
??? В таком буквальном виде это утверждение неверно. Если сравнивать
true с целым значением, то
true будет преобразовано к значению
1. А
1 не равно
204. Поэтому условие
true == 204 всегда гарантированно
ложно.
Я примерно понимаю, что вы хотели сказать - с точностью до наоборот: в булевском контексте любое ненулевое целочисленное значение приводится к
true. Однако как это относится к теме - не ясно.
-- 09.11.2022, 18:44 --Но в скобке дебагер дает некую цифру (204).
Вы нас скорее всего обманываете. Ваше булевское значение не имеет никакого отношения к тем переменным, которые вы привели выше. Значение
204 в шестнадцатеричном виде - это
0xCC. Это подозрительно похоже на какой-то дебажный заполнитель для неинициализированной памяти. То есть вы смотрите на
неинициализированную переменную типа
bool, которая содержит "мусорное" значение.
Самое поразительное, что оператор
Код:
if([b]true [/b]&& [b]true(204)[/b]) = false;
Это какая-то загадка, так как 204 - если это число, по сути тоже
true.
Нет, нет, нет, ни в коем случае.
204 в переменной типа
bool - это не
true.
Обращение к "мусорной" булевской переменной порождает неопределенное поведение. На практике, если ее физическое представление не совпадает с корректным представлением
true или
false на вашей платформе, то такая булевская переменная может вести себя и как "ни
true, ни
false", так и как "и
true, и
false одновременно". Этот "феномен" очень часто встречается на практике и удивленными вопросами на эту тему забит весь инет. Не пытайтесь работать с неинициализированными переменными.
На вашей платформе (как и на большинстве платформ)
false скорее всего физически представляется как байт
0x00, а
true - как байт
0x01. Это значит, что
204 в
bool будет вести себя непредсказуемым образом.
Вот вам небольшая программка навскидку
Код:
#include <iostream>
#include <cstring>
bool return_bad_bool() __attribute__((noinline));
bool return_bad_bool()
{
bool b;
std::memset(&b, 204, 1);
return b;
}
int main()
{
bool b = return_bad_bool();
if (b)
std::cout << "True!" << std::endl;
if (!b)
std::cout << "False!" << std::endl;
}
При компиляции GCC без оптимизаций эта программа выдает одновременно "True! False!"
http://coliru.stacked-crooked.com/a/ded1d2461a7915f2При компиляции GCC c -O3 эта программа выдает "True!"
http://coliru.stacked-crooked.com/a/e8ff36833396d507При компиляции Clang она всегда выдает "False!"
http://coliru.stacked-crooked.com/a/cc113189bb73726cПосмотрев на сгенерированный ассемблерный код, вы сможете понять, почему так происходит. Но с точки зрения языка это просто
неопределенное поведение.
Вот именно это явление вы и наблюдаете в вашем
if, когда пытаетесь пихать в него "мусорный"
bool.