Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [ 36 ] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Часть


Правила, относящиеся к языку Си

В этой главе рассматриваются специфичные для Си правила программирования, не встречавшиеся в предыдущих разделах.



85. Подавляйте демонов сложности (часть 2)

Демоны запутанности особенно опасны в Си. Кажется, что этот язык сам собой поощряет выбор неестественно усложненных решений для простых задач. Последующие правила посвящаются этой проблеме.

85.1. Устраняйте беспорядок

Язык Си предоставляет богатый набор операторов и, как следствие, предлагает множество способов ничего не делать, что и иллюстрируется примерами из таблицы 2.

Таблица 2. Как ничего не делать в Си

Плохо

Хорошо

Комментарии

type *end = array; end += len-1;

type *end = array+(len-1)

Инициализируйте при объявлении.

while (*p++ != \0)

while ( *p++)

!=0 ничего не делает в

выражении

отношения

while (gets(buf) != NULL)

while (gets(buf) )

if ( p != NULL )

if (p)

if ( p == NULL )

if (!p)

if (условие != 0)

if ( условие )

if (условие == 0)

if (!условие )

if( условие ) return TRUE;

else

return FALSE;

return условие;

(или return условие ! = 0. Если оно не бгло вернгм, то вы не сможете выполнить return TRUE.

return условие ?0:1; return условие?1:0;

return !условие; return условие!=0;

Используйте соответствующий оператор. Операторы отношения типа ! и ! = выполняют по определению сравнение с 1 или 0.

++x;

f(x);

--x;

f( x-1 );

Не модифицируйте значение, если вам после этого не нужно его использовать более одного раза.

return ++x;

return x+1;

См. предыдущее правило.

int x;

f( (int)x );

f(x);

Переменная x и так имеет тип int.

(void) printf("все в порядке");

printf("все в порядке");

Попросту опускайте возвращаемый тип, если



if (x>y) else if (x<y)

else if ( x ==y )

*(p+i)

if (x>y)

else if (x<y)

else

p[i];

он вам не нужен.

Если первое значение не больше и не меньше второго, то они должны

быть равны.

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

Раз мы уж заговорили о ничегонеделаньи, то имейте в виду, что Си с удовольствием допускает выражения, которые ничего не делают. Например, следующий оператор, показываемый полностью, совершенно законен и даже не вызовет предупреждающего сообщения компилятора:

a+b;

Конечно, если вы хотели записать:

a+=b;

то вы, должно быть, попали в беду.

85.2. Избегайте битовых масок; используйте битовые поля

Многие программисты, в особенности те, кто начинал жизнь с языком ассемблера, привыкли пользоваться битовыми масками, а не битовыми полями. Мне довелось видеть много программ, подобных следующей:

struct fred

int status;

#define CONDITION A #define CONDITION B

0x01 0x02

Комментарий в язхке Си должен быть заключен в /* */. - Ред.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 [ 36 ] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76