Правила программирования на Си и Си++

       

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


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

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

Плохо

Хорошо

Комментарии

type *end = array;

end += len-1;



type *end =

array+(len-1)

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

while (*p++ != '\0')

while ( *p++)

while (gets(buf) != NULL)

while (gets(buf) )

if ( p != NULL )

if ( p )

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

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 )

if ( x y )

else if ( x y )

else

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

*(p+i)

p[i];

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

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

a + b;

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

a += b;

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



Содержание раздела