|
bool "третье состояние" |
|
|
|
Jul 22 2009, 07:34
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228

|
Код #include <stdbool.h>
int main() { bool B; B = 13; //B = 1 B = !B; //B = 0 unsigned char* Ptr; Ptr = (unsigned char*)(&B); *Ptr = 13; //B = 13 bool B2; B2 = B; //B2 = 12 B2 = !B; //B2 = 13 return 0; } Почему при присваивание непосредственно числа все нормально ( B = 13 ), а при присваивании другово bool ( B2 = B ) мусор остается? Так и должно быть?
|
|
|
|
|
 |
Ответов
|
Jul 22 2009, 10:28
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228

|
я в этом вижу потенциальную проблему, например, при чтении бинарного файла данных.Придется производить доп. операции, что бы избавиться от мусора: Код //data.bin = {0x0D, 0x00, 0x00, 0x00} f = fopen("data.bin", "r"); fread(&B, sizeof(B), 1, f); //B = 13 fclose(f); //Избавляемся от мусора if (B) B = true; else B = false;
|
|
|
|
|
Jul 22 2009, 11:11
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(HEX @ Jul 22 2009, 13:28)  я в этом вижу потенциальную проблему, например, при чтении бинарного файла данных.Придется производить доп. операции, что бы избавиться от мусора: Естественно придется. Но несколько иначе: Код //data.bin = {0x0D, 0x00, 0x00, 0x00} f = fopen("data.bin", "r"); uint8_t Tmp; fread(&Tmp, sizeof(Tmp), 1, f); B = Tmp; fclose(f); Все. Компилятор знает, как преобразовать внутреннее представление uint8_t во внутреннее представление bool. Не надо мешать ему, пытаясь сделать его работу через неявное преобразование при помощи указателей. А если в вашем компиляторе bool будет 32 бита, что вы считаете из файла вашим методом? Цитата(HEX @ Jul 22 2009, 11:56)  Если бы не мешали я бы может и не заметил: Код //B = 13 if (B == true) printf("true\n"); else printf("false\n"); Еще раз: каким образом вы присвоили B значение 13? Оператором B = 13 вы не можете присвоить переменной типа bool значение, отличное от true и false. Если вы присвоили через указатель на другой тип - это жульничество, и компилятор ведет себя как считает нужным. Ибо запись B = 13 фактически означает B = bool(13), и 13 в B ну никак попасть не сможет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 22 2009, 14:57
|
Участник

Группа: Свой
Сообщений: 54
Регистрация: 25-11-04
Из: Тула
Пользователь №: 1 228

|
Цитата(Сергей Борщ @ Jul 22 2009, 15:11)  А если в вашем компиляторе bool будет 32 бита у меня собственно так и есть, универсальность эта другая тема. Цитата(Сергей Борщ @ Jul 22 2009, 15:11)  Если вы присвоили через указатель на другой тип - это жульничество да жульничество, но интервейс вызова Read(void* Buff, int N) достаточно широко используется, есть и другие варианта попадание мусора в bool. Но проверять значение после подозрительных мест надо обязательно. Потом такой момент, если используется swtich, пусть даже с параметром enum, все равно в голове помним о левых значениях, которые обработаем default. При работе с bool переменными думается true/false, а там может и вигная какая то быть, причем "заразная", передается присваиванием ( B2 = B1 ). А явное преобразование B = (bool)( B ) по моему, должно работать четко.
|
|
|
|
Сообщений в этой теме
HEX bool "третье состояние" Jul 22 2009, 07:34 AHTOXA Вероятно, компилятор производит преобразования тип... Jul 22 2009, 07:47 HEX явное преобразование типа тоже не помогает:КодB2 =... Jul 22 2009, 08:34  AHTOXA Цитата(HEX @ Jul 22 2009, 14:34) явное пр... Jul 22 2009, 08:40 Xenia Цитата(HEX @ Jul 22 2009, 10:34) Почему п... Jul 22 2009, 08:38 HEX Цитата(Xenia @ Jul 22 2009, 12:38) Таким ... Jul 22 2009, 08:56  Xenia Цитата(HEX @ Jul 22 2009, 11:56) выводит ... Jul 22 2009, 11:00   KRS Цитата(Xenia @ Jul 22 2009, 15:00) Это по... Jul 22 2009, 21:02  tag Цитата(HEX @ Jul 22 2009, 11:56) Если бы ... Jul 22 2009, 12:13    Oldring Цитата(HEX @ Jul 22 2009, 18:57) А явное ... Jul 22 2009, 15:34  Oldring Цитата(HEX @ Jul 22 2009, 14:28) я в этом... Jul 22 2009, 11:17 sergeeff Цитата(HEX @ Jul 22 2009, 11:34) Код#incl... Jul 22 2009, 17:15 ReAl Цитата(sergeeff @ Jul 22 2009, 20:15) Суд... Jul 22 2009, 19:52  Сергей Борщ Цитата(ReAl @ Jul 22 2009, 22:52) Код b1 ... Jul 22 2009, 23:27 sensor_ua Использование выражений типа
Кодif(a == true... Jul 23 2009, 08:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|