Выражения
Итак, имена надо подбирать так, чтобы максимально облегчить жизнь читателю; точно так же и выражения следует писать так, чтобы их смысл был предельно ясен. Пишите самый ясный код, какой только возможен. Вставляйте пробелы вокруг операторов для логической группировки выражений; вообще, форматируйте выражения так, чтобы сделать их наиболее удобочитаемыми. Идея тривиальна, но очень полезна: совсем как мысль о том, что чем аккуратнее убран ваш рабочий стол, тем проще на нем найти необходимую вещь. Правда, в отличие от рабочего стола в вашей программе могут копаться и посторонние – и им тоже должно быть удобно.
Форматируйте код, подчеркивая его структуру.
Форматирование кода логично выбранными отступами – самый простой способ добиться того, чтобы структура программы стала самоочевидна.
Приведенный фрагмент плохо отформатирован:
? for(n++;n<100;field[n++]='\(0'); ? *i = \0'; return('\n);
Проведя простейшее форматирование, мы несколько улучшим его:
Еще лучше – перенести оператор присваивания в тело цикла и выделить инкремент (приращение) счетчика в отдельный оператор, тогда цикл примет более традиционный вид и, следовательно, можно будет быстрее догадаться о его смысле.
Используйте естественную форму выражений.
Записывайте выражения в том виде, в котором вы произносили бы их вслух. Условные выражения, содержащие отрицания, всегда трудно воспринять:
if (!(block_id < actblks)!(blocked >= unblocks))
Здесь каждая проверка используется с отрицанием, однако необходимости в этом нет никакой. Достаточно изменить знаки сравнения, и можно обойтись без отрицаний:
if ((blocked >= actblks) || (blockj.d < unblocks))
Теперь код читается вполне естественно.
Используйте скобки для устранения неясностей.
Скобки подчеркивают смысловую группировку кода, и их можно использовать для упрощения понимания его структуры даже тогда, когда с точки зрения грамматики в их применении нет необходимости. Так, в предыдущем примере внутренние скобки не нужны, однако их применение как минимум ничему не мешает. Бывалый программист мог бы и опустить их, поскольку операторы сравнения (<=<==! › ›) имеют более низкий приоритет, чем логические операторы (&& и | |).
Все же, когда используются операторы с различным приоритетом, лучше применять скобки. В языке С и ему подобных существует ряд проблем с последовательностью выполнения операций, так что ошибку сделать совсем не сложно. Поскольку логические операции имеют более высокий приоритет, чем присваивание, употребление скобок обязательно для большинства выражений, использующих оба типа операций:
while ((с = getchar())!= EOF) …