true==1, false==0
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.03.03 08:53
Оценка:
Привет всем.

Сегодня опять всплыла моя темная сторона, которая обожает эээ.... хакинг или фичи C++ (?)

Есть написан цикл. Работающий без претензий

for(const_iterator iPropSet(begin()),_ePropSet(end());iPropSet!=_ePropSet;++iPropSet)
{
 if(CheckFilter((*iPropSet),pPropSetFilter,Include) /*возвращается bool*/)
  ++cSets;
}//for iPropSet


Но типа, я же курсе, что true и false можно интерпретировать как 1 и 0 соответственно. И по сему возникла дикая тяга переписать цикл:

for(const_iterator iPropSet(begin()),_ePropSet(end());iPropSet!=_ePropSet;++iPropSet)
{
 //преобразование к bool вставил на всякий пожарный
 cSets+=(bool)CheckFilter((*iPropSet),pPropSetFilter,Include);
}//for iPropSet


Правда, теперь взбунтовалась моя другая половина, которая радеет за написание кода, понятного даже дебилу — каким я и буду, когда снова залезу в эту часть программы через полгода.

Кто что думает по этому поводу?
Может голование устроить ?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: true==1, false==0
От: Аноним  
Дата: 29.03.03 09:02
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:
//...
 cSets+=(bool)CheckFilter((*iPropSet),pPropSetFilter,Include);
//...

я тоже так иногда пишу, ну и что с того...
господа, только не пинайте меня за такое, это может быть больно...
Re[2]: true==1, false==0
От: acme Россия www.ibprovider.com
Дата: 29.03.03 09:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Коваленко Дмитрий, Вы писали:

//...
cSets+=static_cast<bool>(CheckFilter((*iPropSet),pPropSetFilter,Include));
//...

Но реальные пацаны все-таки предпочитают использовать static_cast для bool
Re: true==1, false==0
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 29.03.03 09:20
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

[]

КД>Но типа, я же курсе, что true и false можно интерпретировать как 1 и 0 соответственно.



А можно интерпретировать и как -1 и 0 соответственно. Вообще-то, я как-то давно уже привык, что true — это любое отличное от 0 значение, false — ноль. Так шта...
Re: true==1, false==0
От: Павел Кузнецов  
Дата: 29.03.03 09:32
Оценка: 10 (2)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>
КД>  cSets+=(bool)CheckFilter((*iPropSet),pPropSetFilter,Include);
КД>


Можно и без приведения типов:

cSets += CheckFilter(*iPropSet, pPropSetFilter, Include) != 0;
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: true==1, false==0
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.03.03 09:35
Оценка:
Здравствуйте, Flamer, Вы писали:

F>А можно интерпретировать и как -1 и 0 соответственно. Вообще-то, я как-то давно уже привык, что true — это любое отличное от 0 значение, false — ноль. Так шта...


Ну мы же про С++ говорим, а не про VB

Предлагаешь писать
cSets+=CheckFilter((*iPropSet),pPropSetFilter,Include)?1:0;

Вообщем, тоже ничего. Но, чего-то удовлетворения не ощущается

Я почему начал этот топик. В какой-то толковой книженции прочитал, что глупо не использовать очевидные возможности языка программирования. На практике может, ну например из за сбоя, true стать скажем 2 ?

Вообще, что по этому поводу думают эксперты промышленного программирования ?
Хотя вот Павел появился
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: true==1, false==0
От: ilnar Россия  
Дата: 29.03.03 09:45
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Привет всем.


КД>Сегодня опять всплыла моя темная сторона, которая обожает эээ.... хакинг или фичи C++ (?)


КД>Но типа, я же курсе, что true и false можно интерпретировать как 1 и 0 соответственно. И по сему возникла дикая тяга переписать цикл:


false == 0 — yes
true = (all — false)
all = 0,1,2,...,-1,-2,....
Re[2]: true==1, false==0
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.03.03 09:51
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

Вот что откопал в ассемблерном коде.

cSets+=(bool)CheckFilter((*iPropSet),pPropSetFilter,Include);


xor edx,edx
mov dl,al
add ...,edx


ПК>Можно и без приведения типов:

cSets += CheckFilter(*iPropSet, pPropSetFilter, Include) != 0;


test  al,al
setnz cl
and   ecx,0x01
add   ...,ecx


Здесь же все равно приводится к bool, хотя, конечно, если нам вернется true==2 то мы его насильно приведем к 1. В варианте с (bool), как показано выше, мы таки можем присвоить 2.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: true==1, false==0
От: Павел Кузнецов  
Дата: 29.03.03 09:53
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД> Здесь же все равно приводится к bool, хотя, конечно, если нам

КД> вернется true==2 то мы его насильно приведем к 1. В варианте с
КД> (bool), как показано выше, мы таки можем присвоить 2.

true всегда преобразуется в 1. Никакого другого значения, ни с приведением,
ни без получить невозможно.
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: true==1, false==0
От: Павел Кузнецов  
Дата: 29.03.03 09:54
Оценка:
Здравствуйте, ilnar, Вы писали:

i> false == 0 — yes

i> true = (all — false)
i> all = 0,1,2,...,-1,-2,....

Это не так. В языке C++ false всегда преобразуется к 0, а true — к 1.
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: true==1, false==0
От: Павел Кузнецов  
Дата: 29.03.03 09:55
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД> На практике может, ну например из за сбоя, true стать скажем 2?


Если true при преобразовании к int даст 2, то ожидать чего-нибудь "разумного"
от дальнейшего выполнения программы не приходится.
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: true==1, false==0
От: Павел Кузнецов  
Дата: 29.03.03 09:56
Оценка:
Здравствуйте, Flamer, Вы писали:

F> А можно интерпретировать и как -1 и 0 соответственно.


Можно. Но тогда придется все время сражаться с компилятором, упрямо приводящим true к 1.
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: true==1, false==0
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.03.03 10:06
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Можно и без приведения типов:

cSets += CheckFilter(*iPropSet, pPropSetFilter, Include) != 0;


По-моему, это просто другая запись вышеприведенного контрольного приведения к (bool). Хотя, правда, компилятор чего-то не стал так считать.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: true==1, false==0
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.03.03 10:19
Оценка: 8 (2)
Вот нашел способ, успокоить свою светлую половину сознания

 assert(true==1);
 assert(bool(2)==1);
 assert(false==0);


Оформлю в виде макроса и добавлю в нашу внутреннюю библиотеку для С++
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: true==1, false==0
От: Кодт Россия  
Дата: 29.03.03 11:49
Оценка:
Здравствуйте, Flamer, Вы писали:

F>А можно интерпретировать и как -1 и 0 соответственно. Вообще-то, я как-то давно уже привык, что true — это любое отличное от 0 значение, false — ноль. Так шта...


false == 0
true == 1
Это — стандарт.

Любой скалярный тип приводится к булевскому через сравнение с 0.
Конструкции, принимающие на вход bool — т.е. if(), while(), ?: — в случае скалярных значений разворачиваются именно так:
if(v) === if(v != 0)

Иногда (а в виндоузе — повсеместно) используется тип BOOL == int. В нем принято FALSE=0, TRUE=1, истина=чтоугодноне0.
Видимо, так сделано из соображений производительности...

Ну, и стоит заметить, что в VisualBasic (и, соответственно, в OLE) True = Integer(-1) = 32767.
Перекуём баги на фичи!
Re[2]: true==1, false==0
От: Аноним  
Дата: 29.03.03 15:06
Оценка: +1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Можно и без приведения типов:


ПК>
ПК>cSets += CheckFilter(*iPropSet, pPropSetFilter, Include) != 0;
ПК>


Можно еще хуже:

cSets += !!CheckFilter(*iPropSet, pPropSetFilter, Include);


Re: true==1, false==0
От: George Seryakov Россия  
Дата: 29.03.03 20:12
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>
...
КД> cSets+=(bool)CheckFilter((*iPropSet),pPropSetFilter,Include);
...
КД>


КД>Правда, теперь взбунтовалась моя другая половина, которая радеет за написание кода, понятного даже дебилу — каким я и буду, когда снова залезу в эту часть программы через полгода.


КД>Кто что думает по этому поводу?


Переопредели CheckFilter чтоб возвращал int. А за += bool я бы по рукам бил.
GS
Re[2]: true==1, false==0
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 29.03.03 21:06
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>А за += bool я бы по рукам бил.


Ну зачем же так ?
По Стандарту — совершенно "defined behaviour":

C++ Standard, 4.5/4
An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true
becoming one
.

... << RSDN@Home 1.0 beta 6a >>
Re[3]: true==1, false==0
От: George Seryakov Россия  
Дата: 30.03.03 03:01
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

GS>>А за += bool я бы по рукам бил.


ММ>Ну зачем же так ?

ММ>По Стандарту — совершенно "defined behaviour":

ММ>

C++ Standard, 4.5/4
ММ>An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true
ММ>becoming one
.


Мои индусы много чего не читали, кроме стандарта, и систематически путают bool и VARIANT_BOOL.
GS
Re[4]: true==1, false==0
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 30.03.03 06:11
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Мои индусы много чего не читали, кроме стандарта, и систематически путают bool и VARIANT_BOOL.


Да... тяжелая ситуация
... << RSDN@Home 1.0 beta 6a >>
Re[4]: немного не в тему
От: Par-zzz  
Дата: 30.03.03 15:40
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Мои индусы много чего не читали, кроме стандарта, и систематически путают bool и VARIANT_BOOL.


Вот все без конца говорят про спецификации и стандарты, а где их взять??? В поиске написал, так там такой пресс совпадений, даже пробовать искать не стал(интернет дома, дорого). Дайте плз. ссылочки, буду очень презнателен.
/**
* у человека столько проблем, сколько он их себе создает
*/
Re[5]: немного не в тему
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 30.03.03 21:52
Оценка: 12 (1)
Здравствуйте, Par-zzz, Вы писали:

PZ>Вот все без конца говорят про спецификации и стандарты, а где их взять??? В поиске написал, так там такой пресс совпадений, даже пробовать искать не стал(интернет дома, дорого). Дайте плз. ссылочки, буду очень презнателен.


Пожалуйста

Re[3]: Стандарты C и C++
Автор: Павел Кузнецов
Дата: 05.02.03


а также здесь
Автор: Kaa
Дата: 31.05.02
... << RSDN@Home 1.0 beta 6a >>
Re[6]: немного не в тему
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 30.03.03 21:58
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

Ну и нелишним будет заиметь С++ Standard revisions
Автор: Павел Кузнецов
Дата: 19.09.02
... << RSDN@Home 1.0 beta 6a >>
Re: true==1, false==0
От: small_cat Россия  
Дата: 31.03.03 07:11
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

Я думаю, что невзначай темная сторона может стать светлой из-за звезд, возникщих в глазах при порировании системы. Насколько я помню, 1 — это Win специфик, в никсах (утверждать не буду, но где-то слышал) TRUE == -1. Компляторах, есс-но.
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re[4]: true==1, false==0
От: small_cat Россия  
Дата: 31.03.03 07:12
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>true всегда преобразуется в 1. Никакого другого значения, ни с приведением,

ПК>ни без получить невозможно.

А гарантии где? В стандарте, по моему, четко сказано только про false.
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re[2]: true==1, false==0
От: small_cat Россия  
Дата: 31.03.03 07:14
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

Оригинально!
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re[2]: true==1, false==0
От: Павел Кузнецов  
Дата: 31.03.03 07:35
Оценка:
Здравствуйте, small_cat, Вы писали:

sc> Насколько я помню, 1 — это Win специфик, в никсах (утверждать не буду,

sc> но где-то слышал) TRUE == -1. Компляторах, есс-но.

TRUE — может быть, но true всегда и везде == 1.
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: true==1, false==0
От: Павел Кузнецов  
Дата: 31.03.03 07:37
Оценка:
Здравствуйте, small_cat, Вы писали:

ПК>> true всегда преобразуется в 1.


sc> А гарантии где? В стандарте, по моему, четко сказано только про false.


Цитату уже приводили... Скопирую еще раз:

4.5
4
An rvalue of type bool can be converted to an rvalue of type int,
with false becoming zero and true becoming one.

Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: true==1, false==0
От: small_cat Россия  
Дата: 31.03.03 07:47
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

Спасибо, чего-то меня переклинило... И у Страуструпа тоже четко int(true) == 1.
И где я мог слышать про -1?
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.