Устраняйте беспорядок
Язык Си предоставляет богатый набор операторов и, как следствие, предлагает множество способов ничего не делать, что и иллюстрируется примерами из таблицы 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;
то вы, должно быть, попали в беду.