реклама на сайте
подробности

 
 
> bool "третье состояние"
HEX
сообщение Jul 22 2009, 07:34
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 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 ) мусор остается?
Так и должно быть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Jul 22 2009, 08:38
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(HEX @ Jul 22 2009, 10:34) *
Почему при присваивание непосредственно числа все нормально ( B = 13 ), а при присваивании другово bool ( B2 = B ) мусор остается? Так и должно быть?


В каждом компиляторе работа с bool может быть организована по-разному. Ваш компилятор очевидно конверсию в bool производит на этапе присваивания, а работает с bool-переменными, используя только их младший бит. Такой подход эффекитивен при компиляции, т.к. упрощает булевские операции, позволяя делать их "не глядя". В противном случае приведение типа пришлось бы делать при каждой булевской операции с ее использованием.
Таким образом "мусор" не мешает работе программы, поскольку все остальные биты, кроме младшего, в работе не участвуют.
Go to the top of the page
 
+Quote Post
HEX
сообщение Jul 22 2009, 08:56
Сообщение #3


Участник
*

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



Цитата(Xenia @ Jul 22 2009, 12:38) *
Таким образом "мусор" не мешает работе программы...


Если бы не мешали я бы может и не заметил:
Код
//B = 13
  if (B == true)
    printf("true\n");
  else
    printf("false\n");

  B = !B;
  if (B == true)
    printf("true\n");  
  else
    printf("false\n");

выводит только "true"
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jul 22 2009, 11:00
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(HEX @ Jul 22 2009, 11:56) *
выводит только "true"


Я уже объясняла, что сложности с набитыми мусором булевскими переменными возникают исключительно при проведении булевских операций над ними, что заставляет компилятор во имя эффективности использовать только младший бит этого числа. Однако при проверке булевой переменной (например для ветвления по оператору if) такой проблемы не возникает, и тут компилятор проверяет переменную "честно". Это потому, что поверка одного бита "стоит" ровно столько же, сколько проверка всех битов - тестирование регистра на нулевое значение занимает столько же инструкций, как и тестирование одного его бита. А вот булевские операции (типа ! ~ ^ & |) над одним битом производятся элементарно, а над мусорными переменными нет.

Код
//B = 13
  if (B == true)
    printf("true\n");
  else
    printf("false\n");


- тут B тестируется на ненулевое значение, а потому ЛЮБОЕ ненулевое значение B напечатает true.

Код
  B = !B;
  if (B == true)
    printf("true\n");  
  else
    printf("false\n");


- а тут операция B = !B компилируется экономно - инверсией младшего бита. Можно было бы сразу инвертировать все биты числа, но мусор от этого останется мусором, но в false не превратится.
Попробуйте сами вместо компилятора оттранслировать B = !B. Тогда поймете, что без ветвления по if/else этого сделать нельзя.

Код
  //Избавляемся от мусора
  if (B)
    B = true;
  else
    B = false;


Избавляться от мусора короче так:
B = B ? true : false;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
||- - 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, 11:34) Ptr = (u...   Jul 22 2009, 08:47
|- - HEX   я в этом вижу потенциальную проблему, например, пр...   Jul 22 2009, 10:28
|- - Сергей Борщ   Цитата(HEX @ Jul 22 2009, 13:28) я в этом...   Jul 22 2009, 11:11
||- - HEX   Цитата(Сергей Борщ @ Jul 22 2009, 15:11) ...   Jul 22 2009, 14:57
||- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01407 секунд с 7
ELECTRONIX ©2004-2016