Оператор сравнения C ++ не возвращает true или false

0

У меня есть следующая программа

int a = 216;
bool* v = (bool*)((void*)&a);
std::cout << (*v == true) << endl;

Я ожидал, что эта программа будет распечатывать true или false, но вместо этого она выдает 216. Я скомпилировал ее с помощью g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2. Ожидается ли поведение или ошибка? Почему оператор равенства возвращал бы другой тип, чем bool?

--------- РЕДАКТИРОВАТЬ ---------

Мое намерение состоит не в том, чтобы отбрасывать в пустоту, а в том, чтобы хранить v 216 в памяти. Альтернативная программа может выглядеть так:

bool v;
int a = 216;
memcpy(&v, &a, sizeof(bool));
std::cout << (v == true) << endl;

Или я могу взять неинициализированный указатель bool, который указывает на случайное значение, которое, например, 216.

  • 1
    v указывает на временный (созданный из всех приведений), который недопустим в конце строки, которая его создала. Может быть, сделать v bool не bool* . Имейте в виду, что v всегда будет истинным, здесь оно указывает на правильную ячейку памяти (адрес a ). Попробуйте bool v = (&a);
  • 0
    Невозможно воспроизвести . Я не вижу 216 в стандартный stdout .
Показать ещё 2 комментария
Теги:
operators
logical-operators
compiler-bug

2 ответа

5

Единственное, что вы можете сделать после ввода указателя на void*, - это вернуть его к исходному типу указателя (в вашем случае int*). Вы бросаете его на bool* хотя, что приводит вас в область неопределенного поведения. Или, другими словами, вы не можете ожидать, что что-то произойдет определенным образом.

Вы можете подумать, что избавиться от приведения к void* решит это. Однако разыменование указателя после его разметки на другой тип указателя также приводит к неопределенному поведению.

Ожидаемый результат может быть легко достигнут таким образом:

bool v = (bool) a;
std::cout << (v == true) << std::endl;
  • 0
    Приведение к пустоте было сделано только для того, чтобы указать на некоторую ячейку памяти, в которой есть 216. Вы можете попытаться сделать это различными способами, например, вы можете записать 216 в область памяти, зарезервированную для bool. Результат будет таким же.
  • 0
    @Trismegistos: звучит так, как будто вы записали целочисленное значение в переменную bool путем приведения bool* к int* а затем разыменования int* для установки значения. Если это так, пожалуйста, проверьте второй абзац моего ответа - это также приводит к неопределенному поведению.
Показать ещё 3 комментария
0
int a = 216;
bool* v = (bool*)((void*)&a);
std::cout << (*v == true) << endl;

a = 216 = 128 + 64 + 16 + 8 = 00000... 11011000

* v = 1000, и если мы напечатаем его, он отобразит true...

Но true = 0001 и не удовлетворяет * v == true

Конечно, это догадка после моих экспериментов...

Благодаря вам после этого я всегда что-то использую! = False, а не что-то == true...

или что-то == ложное вместо чего-то! = true...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню