Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Битовые операции с типом bool / 25 сообщений из 35, страница 1 из 2
15.10.2015, 17:50
    #39077959
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Подскажите, корректно ли общаться с типом bool используя битовые операции, к примеру для модификации флага. Встретил в чужом коде, чувствую что-то не то, но объяснить не могу или зря волнуюсь?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
bool flResult = false;
if( firstCond() ){
   flResult |= true;
}
if( secondCond() ){
   flResult |= true;
}
...


или лучше и надежней
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
bool flResult = false;
if( firstCond() ){
   flResult = true;
}

if( secondCond() ){
   flResult = true;
}
...


если лучше, то почему?
...
Рейтинг: 0 / 0
15.10.2015, 18:02
    #39077969
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
da17чувствую что-то не то
Правильно чувствуешь. Ибо бред.
Код: sql
1.
bool flResult = firstCond() | secondCond();


Всё, телемаркет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.10.2015, 18:25
    #39077988
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
da17Подскажите, корректно ли общаться с типом bool используя битовые операции, к примеру для модификации флага.


Некорректно. По стандарту.
...
Рейтинг: 0 / 0
15.10.2015, 18:27
    #39077992
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
MasterZivНекорректно. По стандарту.
Стандарт С++ запрещает неявное приведение буля к целому и обратно?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.10.2015, 18:28
    #39077993
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Dimitry SibiryakovMasterZivНекорректно. По стандарту.
Стандарт С++ запрещает неявное приведение буля к целому и обратно?..


Туда -- нет. Обратно -- да.
...
Рейтинг: 0 / 0
15.10.2015, 18:29
    #39077994
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
MasterZivDimitry Sibiryakovпропущено...

Стандарт С++ запрещает неявное приведение буля к целому и обратно?..


Туда -- нет. Обратно -- да.

А, хотя, парни, могу уже и наврать... Что-то я давно не брал в руки шашек...
...
Рейтинг: 0 / 0
15.10.2015, 19:04
    #39078020
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
da17, замени bool на int. Почувствуй вкус свободы!
...
Рейтинг: 0 / 0
15.10.2015, 19:47
    #39078042
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Если не путаю, то по стандарту 0 это false, а все остальное true. Тогда |= true равносильно = true. Но true & true может оказаться false, поэтому не стоит битовые операции использовать.
...
Рейтинг: 0 / 0
15.10.2015, 20:01
    #39078047
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Dima TЕсли не путаю, то по стандарту 0 это false, а все остальное true
путаешь и сильно

bool - не числовой тип
...
Рейтинг: 0 / 0
15.10.2015, 20:03
    #39078050
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
bool - презерватив в сях.
...
Рейтинг: 0 / 0
15.10.2015, 21:06
    #39078081
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
ИзопропилDima TЕсли не путаю, то по стандарту 0 это false, а все остальное true
путаешь и сильно

bool - не числовой тип
А какой?
что же тогда компилятор не ругается на битовые операции с ним? как это в асме выражается после компиляции?
...
Рейтинг: 0 / 0
15.10.2015, 21:11
    #39078085
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Dima Tчто же тогда компилятор не ругается на битовые операции с ним?
приведение к целому и обратно автоматически делает
...
Рейтинг: 0 / 0
15.10.2015, 21:21
    #39078089
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Dima Tкак это в асме выражается после компиляции?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int test1(bool arg){
 return arg;
}

bool test2(int  arg){
 return arg;
}


Код: sql
1.
2.
3.
4.
5.
6.
7.
	movzbl	%cl, %eax
	ret


	testl	%ecx, %ecx
	setne	%al
	ret
...
Рейтинг: 0 / 0
15.10.2015, 21:25
    #39078093
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Не, в одну строчку плохо будет смотреться. Там несколько проверок датчиков, если все норм., то флаг остается false, не хочу тут спорить о архитектуре и т.д. Немного некомфортно, т.к. приходится проверять себя, правильно ли я понял, что "хотел сказать автор". Как-то битовые для битовых структур, логические для bool. Непривычно. Но если все корректно с точки зрения стандарта, значит кому-то так удобней.
...
Рейтинг: 0 / 0
15.10.2015, 21:27
    #39078098
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
1) В числовом контексте bool неявно приводится к 0 и 1.
2) В булевом контексте число неявно приводится к false (0) и true (остальные значения).
3) Для битовых операций аргументы неявно приводятся к int
4) Это все описано в стандарте С++.

Таки образом битовые операции над bool полностью легальны и их результат точно определен стандартом.
Речь идет только про встроенный тип bool в С++.
В языке С bool это обычно int и там возможны эффекты связанные что int может принимать значения помимо 0 и 1. Хотя обычно никаких проблем и там нет, если всегда гарантировать что в переменных значения только 0 и 1.
...
Рейтинг: 0 / 0
15.10.2015, 21:35
    #39078102
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Dima T,
|=true равносильно =true, но это не равносильно & true. В данном случае если флаг был спрошен в true дальше будет выполняться побитовое или. Я так понял под true & true !=true, вы имеете в виду случай 255+1 если у нас на хранение результата выделяется лишь один байт. Я вас правильно понял? Т.е. в данном случае нам такое не грозит или грозит?
...
Рейтинг: 0 / 0
15.10.2015, 21:36
    #39078104
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
da17Подскажите, корректно ли общаться с типом bool используя битовые операции, к примеру для модификации флага. Встретил в чужом коде, чувствую что-то не то, но объяснить не могу или зря волнуюсь?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
bool flResult = false;
if( firstCond() ){
   flResult |= true;
}
if( secondCond() ){
   flResult |= true;
}
...


или лучше и надежней
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
bool flResult = false;
if( firstCond() ){
   flResult = true;
}

if( secondCond() ){
   flResult = true;
}
...


если лучше, то почему?
Оба кода абсолютно корректны. Но первый смотрится глуповато. А второй не очень красив. Так лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
bool flResult = false;

flResult |= firstCond();
flResult |= secondCond();

if ( flResult  )
{
}


Вот так смотрится странно (похоже на ошибку), но работать будет:

Код: plaintext
1.
2.
3.
if ( firstCond() | secondCond() )
{
}



Но лучше так:

Код: plaintext
1.
2.
3.
if ( firstCond() || secondCond() )
{
}



В вариантах с двумя функциями в одном условии нужно помнить про укороченную форму вычисления логических выражений! Это очень важно. Последние два моих кода идентичны друг другу, но не идентичны моему первому коду!!!
...
Рейтинг: 0 / 0
15.10.2015, 21:37
    #39078106
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Anatoly Moskovsky1) В числовом контексте bool неявно приводится к 0 и 1.
2) В булевом контексте число неявно приводится к false (0) и true (остальные значения).
3) Для битовых операций аргументы неявно приводятся к int
4) Это все описано в стандарте С++.

Таки образом битовые операции над bool полностью легальны и их результат точно определен стандартом.
Речь идет только про встроенный тип bool в С++.
В языке С bool это обычно int и там возможны эффекты связанные что int может принимать значения помимо 0 и 1. Хотя обычно никаких проблем и там нет, если всегда гарантировать что в переменных значения только 0 и 1.
Ясно. Поясните пожалуйста, что означает "хотя обычно никаких проблем нет", т.е. есть такие ситуации когда проблемы могут быть? Можете пример привести?
...
Рейтинг: 0 / 0
15.10.2015, 21:39
    #39078107
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
petrav,
да так гораздо лучше. Согласен.
...
Рейтинг: 0 / 0
15.10.2015, 21:40
    #39078109
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
da17,

Код: plaintext
1.
2.
3.
typedef int Bool;
Bool x = 2;
if ((x | true) == true) ... // не сработает, а с честным bool - сработает, как и должен
...
Рейтинг: 0 / 0
15.10.2015, 21:43
    #39078111
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Ну и с & еще неприятнее.
Код: plaintext
1.
2.
3.
4.
typedef int Bool;
Bool x = 1;
Bool y = 2;
if (x & y) ..  // false хотя оба true
...
Рейтинг: 0 / 0
15.10.2015, 21:47
    #39078114
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
petravНо лучше так:

Код: plaintext
1.
2.
3.
if ( firstCond() || secondCond() )
{
}



опасное это дело, хер его знает какие побочные эффекты имеет secondCond(),
мож таймер какой взводит, мож железка из COM -порта читает
...
Рейтинг: 0 / 0
15.10.2015, 21:48
    #39078116
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
ИзопропилpetravНо лучше так:

Код: plaintext
1.
2.
3.
if ( firstCond() || secondCond() )
{
}



опасное это дело, хер его знает какие побочные эффекты имеет secondCond(),
мож таймер какой взводит, мож железка из COM -порта читает
Я написал про укороченную форму вычисления логических выражений.
...
Рейтинг: 0 / 0
15.10.2015, 21:50
    #39078117
da17
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Anatoly Moskovskyda17,

Код: plaintext
1.
2.
3.
typedef int Bool;
Bool x = 2;
if ((x | true) == true) ... // не сработает, а с честным bool - сработает, как и должен


в данном случае true в скобках как 1 рассматривается? Т.е. я правильно понимаю, (3) == true это будет false?
...
Рейтинг: 0 / 0
15.10.2015, 21:57
    #39078119
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Битовые операции с типом bool
Вообще мне кажется хорошим тоном не пользоваться неявным приведением типов к bool. А писать прямо:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int *firstCond();
int secondCond();
bool thirdCond();

if ( firstCond()==nullptr && secondCond()!=0 && thirdCond() )
{
    // Так понятнее. Вот в C# неявных преобразований в/из bool нет.
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Битовые операции с типом bool / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]