Здравствуйте, 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
Здравствуйте, globus000, Вы писали:
G>Товарищи
G>В файле windef.h есть такая строчка
G>#define int BOOL
G>Вопрос: G>Зачем вообще нужен этот тип и чем он лучше bool.
Проблема классического типа bool состоит в том, что он позволяет опреровать лишь с двумерными флагами, в силу ограниченности диапазона допустимых значений этого типа двумя значениями — true и false.
Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага.
Здравствуйте, globus000, Вы писали:
G>#define int BOOL
G>Вопрос: G>Зачем вообще нужен этот тип и чем он лучше bool.
Нужен чтобы обозначить, что некая функция Windows API принимает булевский параметр или возвращает булево значение.
Лучше bool он тем, что доступен в Си, а также был доступен в Си++ тогда, когда в последнем типа bool не было.
Он был введен в седую старину проектировщиками Windows API.
Здравствуйте, 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 было бы яснее)
Здравствуйте, 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
Здравствуйте, Другой Аноним, Вы писали:
ДА>Здравствуйте, globus000, Вы писали:
G>>#define int BOOL
G>>Вопрос: G>>Зачем вообще нужен этот тип и чем он лучше bool.
ДА>Нужен чтобы обозначить, что некая функция Windows API принимает булевский параметр или возвращает булево значение. ДА>Лучше bool он тем, что доступен в Си, а также был доступен в Си++ тогда, когда в последнем типа bool не было. ДА>Он был введен в седую старину проектировщиками Windows API.
То есть объяснение такое
"В С++ нет типа bool а нам нужно что-то для обозначения логических операций
Поэтому вводим BOOL"
Но почему int.
Почему не ограничить двумя значениями true/false.
Здравствуйте, Анатолий Широков
АШ>Ну, это ты погорячилcя — размер bool-а зависит от реализации. О размере була можно лишь утверждать следующее:
Sorry.
Согласен с критиокй.
Но все равно, IMHO если можно обойтись средствами языка, надо ими обходится — код будет более переносимым. Так что, если есть возможность, я бы предпочел bool.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, skyline, Вы писали:
S>IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.
Тем не менее и объект типа bool может быть не равным ни true, ни false.
Здравствуйте, 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 было бы яснее)
Пардон — читать "Работа с многомерными флагами...."
Здравствуйте, Другой Аноним
ДА>Тем не менее и объект типа bool может быть не равным ни true, ни false.
Приведи пример.
А вообще, если так, то станет очень грусно.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, skyline, Вы писали:
S>Здравствуйте, Slick
S>>Тип BOOL — является преопределением типа int и несет такую же смысловую нагрузку что и bool. Он позволяет сохранить все возможности классических флагов, но добавляет новую возможность — многомерность флага. S>IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.
Не было в C bool-а поэтому считали, что (i != 0) == TRUE, (i == 0) == FALSE. А все пошло от того, что оперировать байтами (словами, двойными словами) на порядок быстрее, чем оперировать битами.
Здравствуйте, Другой Аноним, Вы писали:
ДА>Здравствуйте, skyline, Вы писали:
S>>IMHO Многомерный bool — извращение , он нарушает саму природу этого типа данных. BOOL , не являющийся true и false одновременно — все равно, что слегка беременная.
ДА>Тем не менее и объект типа bool может быть не равным ни true, ни false.
Конечно не может
Он или положительно определен или отрицательно.
если мы напишем
int main(int argc, char* argv[])
{
bool is_empty;
Здравствуйте, globus000, Вы писали:
G>То есть объяснение такое G>"В Си нет типа bool а нам нужно что-то для обозначения логических операций G>Поэтому вводим BOOL" G>Но почему int. G>Почему не ограничить двумя значениями true/false.
Ну, наверное просто решили упростить, следуя уже имевшейся практике возврата int из функций в интерфейсах на Си.
Здравствуйте, skyline, Вы писали:
ДА>>Тем не менее и объект типа bool может быть не равным ни true, ни false.
S>Приведи пример. S>А вообще, если так, то станет очень грусно.
Здравствуйте, 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"
Здравствуйте, 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"
Здравствуйте, 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 тогда и только тогда, когда возвращать нужно ложь.
В любом случае, документация MSDN гарантирует, что некая BOOL Fooo(...) возвращает ненулевое значение как истинное.
Трактовать его результат как 1 нельзя.