Правила программирования на С и С++. Главы 7-8 Страница 3. Подавляйте демонов запутанности (Часть 2)
|
Страница 3 из 74 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;то вы, должно быть, попали в беду. |