Правила программирования на С и С++. Главы 7-8 - Подавляйте демонов запутанности (Часть 2)

ОГЛАВЛЕНИЕ

 

85. Подавляйте демонов запутанности (Часть 2).

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

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

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

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

Плохо Хорошо Комментарии
type *end = array; 

end += len-1;

type *end 

= array+(len-1)

Инициализируйте при объявлении. 
while (*p++ != '\0') while ( *p++)  
while (gets(buf) != NULL) while ( gets() )  
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;

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