тип BOOL
От: globus000 Украина  
Дата: 31.07.03 12:03
Оценка:
Товарищи

В файле windef.h есть такая строчка

#define int BOOL

Вопрос:
Зачем вообще нужен этот тип и чем он лучше bool.
Удачи тебе, браток!
Re: тип BOOL
От: skyline Россия  
Дата: 31.07.03 12:13
Оценка:
Здравствуйте, globus000, Вы писали:

G>Товарищи


G>В файле windef.h есть такая строчка


G>#define int BOOL

Он используется как для C, так и для C++.

G>Вопрос:

G>Зачем вообще нужен этот тип и чем он лучше bool.
IMHO::
Он не лучше, а хуже. Хуже хотя бы тем, что он в 4 раза больше bool.
Это одна из попыток промоделировать работу булевского типа данных, коего нет в C.
А как пишет Саттер, булевский тип средствами C создать нельзя, значит, если надо просто булевский тип, то используй bool.
Но если ты взаимодействуешь с API, где используется BOOL, то используй BOOL.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re: тип BOOL
От: Slick Украина  
Дата: 31.07.03 12:13
Оценка: -1
Здравствуйте, globus000, Вы писали:

G>Товарищи


G>В файле windef.h есть такая строчка


G>#define int BOOL


G>Вопрос:

G>Зачем вообще нужен этот тип и чем он лучше bool.


Проблема классического типа bool состоит в том, что он позволяет опреровать лишь с двумерными флагами, в силу ограниченности диапазона допустимых значений этого типа двумя значениями — true и false.

Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага.
Re: тип BOOL
От: Другой Аноним  
Дата: 31.07.03 12:13
Оценка:
Здравствуйте, globus000, Вы писали:

G>#define int BOOL


G>Вопрос:

G>Зачем вообще нужен этот тип и чем он лучше bool.

Нужен чтобы обозначить, что некая функция Windows API принимает булевский параметр или возвращает булево значение.
Лучше bool он тем, что доступен в Си, а также был доступен в Си++ тогда, когда в последнем типа bool не было.
Он был введен в седую старину проектировщиками Windows API.
Re[2]: тип BOOL
От: globus000 Украина  
Дата: 31.07.03 12:21
Оценка:
Здравствуйте, Slick, Вы писали:

S>Здравствуйте, globus000, Вы писали:


G>>Товарищи


G>>В файле windef.h есть такая строчка


G>>#define int BOOL


G>>Вопрос:

G>>Зачем вообще нужен этот тип и чем он лучше bool.


S>Проблема классического типа bool состоит в том, что он позволяет опреровать лишь с двумерными флагами, в силу ограниченности диапазона допустимых значений этого типа двумя значениями — true и false.


S>Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага.


Работа с двумерными флагами — конечно дело хорошее но мне не понятно почему этот тип назван BOOL.
Если я не ошибаюсь, в булевой алгебре может быть только 2 значения — истина/ложь. А тут у наспоявляется тип, претендующий на то чтобы быть булевым, но принимающий совсем иные значения.
То есть если я читаю код и вижу что метод возвращает BOOL логитчно предположить что значения будут TRUE/FALSE а не 1243 или 15. Не кажется ли вам, многоуважаемые, что это нескольок сбивает с толку и вводит неоднозначность.
(Если бы он назывался скажем FLAG было бы яснее)
Удачи тебе, браток!
Re[2]: тип BOOL
От: Анатолий Широков СССР  
Дата: 31.07.03 12:21
Оценка:
G>>Вопрос:
G>>Зачем вообще нужен этот тип и чем он лучше bool.
S>IMHO::
S>Он не лучше, а хуже. Хуже хотя бы тем, что он в 4 раза больше bool.

Ну, это ты погорячилcя — размер bool-а зависит от реализации. О размере була можно лишь утверждать следующее:

1 <= sizeof(bool) <= sizeof(long)

Re[2]: тип BOOL
От: skyline Россия  
Дата: 31.07.03 12:22
Оценка:
Здравствуйте, Slick

S>Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага.

IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[2]: тип BOOL
От: globus000 Украина  
Дата: 31.07.03 12:24
Оценка:
Здравствуйте, Другой Аноним, Вы писали:

ДА>Здравствуйте, globus000, Вы писали:


G>>#define int BOOL


G>>Вопрос:

G>>Зачем вообще нужен этот тип и чем он лучше bool.

ДА>Нужен чтобы обозначить, что некая функция Windows API принимает булевский параметр или возвращает булево значение.

ДА>Лучше bool он тем, что доступен в Си, а также был доступен в Си++ тогда, когда в последнем типа bool не было.
ДА>Он был введен в седую старину проектировщиками Windows API.

То есть объяснение такое
"В С++ нет типа bool а нам нужно что-то для обозначения логических операций
Поэтому вводим BOOL"
Но почему int.
Почему не ограничить двумя значениями true/false.
Удачи тебе, браток!
Re[3]: тип BOOL
От: skyline Россия  
Дата: 31.07.03 12:25
Оценка:
Здравствуйте, Анатолий Широков

АШ>Ну, это ты погорячилcя — размер bool-а зависит от реализации. О размере була можно лишь утверждать следующее:


Sorry.
Согласен с критиокй.


Но все равно, IMHO если можно обойтись средствами языка, надо ими обходится — код будет более переносимым. Так что, если есть возможность, я бы предпочел bool.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[3]: тип BOOL
От: Другой Аноним  
Дата: 31.07.03 12:25
Оценка:
Здравствуйте, skyline, Вы писали:

S>IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.


Тем не менее и объект типа bool может быть не равным ни true, ни false.
Re[3]: тип BOOL
От: globus000 Украина  
Дата: 31.07.03 12:26
Оценка:
Здравствуйте, globus000, Вы писали:

G>Здравствуйте, Slick, Вы писали:


S>>Здравствуйте, globus000, Вы писали:


G>>>Товарищи


G>>>В файле windef.h есть такая строчка


G>>>#define int BOOL


G>>>Вопрос:

G>>>Зачем вообще нужен этот тип и чем он лучше bool.


S>>Проблема классического типа bool состоит в том, что он позволяет опреровать лишь с двумерными флагами, в силу ограниченности диапазона допустимых значений этого типа двумя значениями — true и false.


S>>Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага.


G>Работа с двумерными флагами — конечно дело хорошее но мне не понятно почему этот тип назван BOOL.

G>Если я не ошибаюсь, в булевой алгебре может быть только 2 значения — истина/ложь. А тут у наспоявляется тип, претендующий на то чтобы быть булевым, но принимающий совсем иные значения.
G>То есть если я читаю код и вижу что метод возвращает BOOL логитчно предположить что значения будут TRUE/FALSE а не 1243 или 15. Не кажется ли вам, многоуважаемые, что это нескольок сбивает с толку и вводит неоднозначность.
G>(Если бы он назывался скажем FLAG было бы яснее)

Пардон — читать "Работа с многомерными флагами...."
Удачи тебе, браток!
Re[4]: тип BOOL
От: skyline Россия  
Дата: 31.07.03 12:27
Оценка:
Здравствуйте, Другой Аноним

ДА>Тем не менее и объект типа bool может быть не равным ни true, ни false.

Приведи пример.
А вообще, если так, то станет очень грусно.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Re[3]: тип BOOL
От: Анатолий Широков СССР  
Дата: 31.07.03 12:29
Оценка:
Здравствуйте, skyline, Вы писали:

S>Здравствуйте, Slick


S>>Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага.

S>IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.

Не было в C bool-а поэтому считали, что (i != 0) == TRUE, (i == 0) == FALSE. А все пошло от того, что оперировать байтами (словами, двойными словами) на порядок быстрее, чем оперировать битами.
Re[4]: тип BOOL
От: globus000 Украина  
Дата: 31.07.03 12:34
Оценка:
Здравствуйте, Другой Аноним, Вы писали:

ДА>Здравствуйте, skyline, Вы писали:


S>>IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.


ДА>Тем не менее и объект типа bool может быть не равным ни true, ни false.


Конечно не может
Он или положительно определен или отрицательно.
если мы напишем
int main(int argc, char* argv[])
{
bool is_empty;

if(is_empty)
{
cout<<"empty"<<endl;;
}esle{
cout<<"not empty"<<endl;
}

return 0;
}

то будет выдано обязательно одно из этих сообщений.
А это значит что он всегда определен.
Удачи тебе, браток!
Re[3]: тип BOOL
От: Другой Аноним  
Дата: 31.07.03 12:40
Оценка:
Здравствуйте, globus000, Вы писали:

G>То есть объяснение такое

G>"В Си нет типа bool а нам нужно что-то для обозначения логических операций
G>Поэтому вводим BOOL"
G>Но почему int.
G>Почему не ограничить двумя значениями true/false.

Ну, наверное просто решили упростить, следуя уже имевшейся практике возврата int из функций в интерфейсах на Си.
Re[5]: тип BOOL
От: Другой Аноним  
Дата: 31.07.03 12:43
Оценка:
Здравствуйте, skyline, Вы писали:

ДА>>Тем не менее и объект типа bool может быть не равным ни true, ни false.


S>Приведи пример.

S>А вообще, если так, то станет очень грусно.

См. сноску 42 к 3.9.1(6) в стандарте языка.
Re[5]: тип BOOL
От: Bell Россия  
Дата: 31.07.03 12:51
Оценка: 3 (1)
Здравствуйте, globus000, Вы писали:

ДА>>Тем не менее и объект типа bool может быть не равным ни true, ни false.


G>Конечно не может


Предлагаю ознакомится со стандартом:

3.9.1/6
...
примечение 42:
Using a bool value in ways described by this International Standard as ‘‘undefined,’’ 
such as by examining the value of an uninitialized automatic variable, 
might cause it to behave as if is neither true nor false.



А результат работы приведенного кода не что иное, как один из вариантов "undefined behavior"
Любите книгу — источник знаний (с) М.Горький
Re[6]: тип BOOL
От: globus000 Украина  
Дата: 31.07.03 13:09
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, globus000, Вы писали:


ДА>>>Тем не менее и объект типа bool может быть не равным ни true, ни false.


G>>Конечно не может


B>Предлагаю ознакомится со стандартом:


B>
B>3.9.1/6
B>...
B>примечение 42:
B>Using a bool value in ways described by this International Standard as ‘‘undefined,’’ 
B>such as by examining the value of an uninitialized automatic variable, 
B>might cause it to behave as if is neither true nor false.
B>

B>

B>А результат работы приведенного кода не что иное, как один из вариантов "undefined behavior"


Согласен
Удачи тебе, браток!
Re[3]: тип BOOL
От: Кодт Россия  
Дата: 31.07.03 13:33
Оценка: 13 (4)
Здравствуйте, globus000, Вы писали:

G>Но почему int.

G>Почему не ограничить двумя значениями true/false.

Потому что это int — это машинное слово. (Не в смысле WORD, а в смысле размер регистра).

Допустим, мы выяснили, что для (true,false) достаточно 1 байта (char).
Теперь мы имеем секс:
— при передаче in-параметра в функцию: нужно расширить char до размера слова стека (а это — все тот же int)
— при возврате — обрезать регистр возврата до char (в старших байтах — может быть мусор!)

Ладно, это на платформе x86 делается достаточно просто: используем регистр AL-AX-EAX-(что там на 64битных процах).
Но все равно: зачем заниматься дополнительными действиями?

Как правило, тип BOOL используется только в вызовах функций, а не в структурах, поэтому давиться жабой за каждый байт нет смысла.
Кстати говоря, в структурах вообще не стоит использовать платформенно-зависимые типы (int таковым является) — от этого страдает переносимость.

Еще один момент состоит в следующем:
bool == { 0, 1 } по определению.
BOOL == { 0, что-угодно-но-не-ноль }.
Этим можно пользоваться. Например, возвращать целое число, которое равно 0 тогда и только тогда, когда возвращать нужно ложь.
BOOL not_empty_string(const char* s)
{
  return s[0];
}

BOOL not_empty_file(HFILE hFile)
{
  return FileSize(hFile);
}

Конечно, это хак, но тем не менее.

В любом случае, документация MSDN гарантирует, что некая BOOL Fooo(...) возвращает ненулевое значение как истинное.
Трактовать его результат как 1 нельзя.
Перекуём баги на фичи!
Re[2]: тип BOOL
От: Jenyay http://jenyay.net
Дата: 31.07.03 13:38
Оценка:
Здравствуйте, Другой Аноним, Вы писали:

ДА>был доступен в Си++ тогда, когда в последнем типа bool не было.


То есть в C++ изначально не было bool?
... << RSDN@Home 1.1 beta 1 >>
Софт, исходники и фото
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.