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 >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.