Стив Саммит. Язык си в вопросах и ответах. Булевы выражения и переменные.

Стив  Саммит. Язык си в вопросах и ответах. Булевы выражения и переменные.

Ответы на вопросы разбиты по темам:

1. Нулевые указатели

2. Указатели и массивы.

3. Выделение памяти

4. Выражения

5. ANSI C

6. Препроцессор С.

7. Списки аргументов переменной длины.

8. Булевы выражения и переменные.

9. Структуры, перечисления и объединения.

10. Декларации.

11. Cтандартный ввод/вывод.

12. Библиотечные функции.

13. Lint.

14. Стиль.

15. Операции с плавающей точкой.

16. Интерфейс с операционной системой.

17. Разное (Пребразование Fortran -> C , грамматики для YACC и т.п.)

Булевы выражения и переменные.

8.1     Переменные какого типа правильнее использоваль как булевы? Почему в языке С нет стандартного типа логических переменных? Что использовать для значений true и false — #define или enum?

О:    В языке    С нет стандартного типа    логических переменных, потому что выбор конкретного типа основывается либо на экономии памяти, либо на выигрыше времени. Такие вопросы лучше решать программисту (использование типа int для булевой переменной может быть быстрее, тогда как использование типа char экономит память).
Выбор между #define и enum — личное дело каждого, и споры о том, что лучше, не особенно интересны (Но все же    см. вопрос 9.1). Используйте любой из четырех вариантов
#define TRUE    1          #define YES 1 #define FALSE    0          #define NO  0
enum bool {false, true};      enum bool {no, yes};
или последовательно в пределах программы или проекта используйте числа 1 и 0. (Возможно, задание булевых переменных через enum предпочтительнее, если используемый Вами отладчик раскрывает содержимое enum-переменных).
Некоторые предпочитают такие способы задания:
#define TRUE (1==1) #define FALSE    (!TRUE)
или задают «вспомогательный» макрос
#define Istrue(e) ((e) != 0)
Не видно, что они этим выигрывают ( см.    вопрос 8.2 , а также вопрос 1.6).

8.2    Разве не опасно    задавать значение TRUE как 1, ведь в С любое не равное нулю значение рассматривается как истинное? А если оператор сравнения или встроенный булев    оператор возвратит нечто, отличное от 1?

О:      Истинно (да-да!), что любое ненулевое значение рассматривается в С как значение «ИСТИНА», но это применимо только «на входе», где ожидается булева переменная. Когда булева переменная генерируется встроенным оператором, гарантируется, что она равна 0 или 1. Следовательно, сравнение
if((a == b)    == TRUE)
как ни смешно оно выглядит, будет вести    себя, как ожидается, если значению TRUE соответствует 1. Как правило, явные проверки на TRUE и FALSE    нежелательны, поскольку    некоторые библиотечные функции (стоит упомянуть isupper,isalpha и т.п.), возвращают в случае успеха ненулевое значение, которое _не    обязательно_ равно 1. (Кроме того, если Вы    верите,    что «if((a == b) == TRUE)» лучше чем «if(a == b)» , то почему не пойти дальше и не написать
«if(((a == b) == TRUE)    == TRUE)»?
Хорошее «пальцевое» правило состоит в том, чтобы использовать TRUE и FALSE (или нечто подобное) только когда    булевым    переменным или аргументам функции присваиваются значения или когда значение возвращается булевой функцией, но никогда при сравнении.
Макроопределения препроцессора TRUE и FALSE  используются для большей наглядности, а не потому, что конкретные значения могут    измениться. (См. также вопросы 1.7,    1.9).
Смотри: K&R I Разд. 2.7 c. 41; K&R II Разд. 2.6 c. 42, Разд. A7.4.7 c. 204, Разд. A7.9 c. 206; ANSI Разд. 3.3.3.3, 3.3.8, 3.3.9, 3.3.13, 3.3.14, 3.3.15, 3.6.4.1, 3.6.5… …Догонит ли Ахиллес и черепаху?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *