Иллюстрированный самоучитель по практике программирования

Выражения

Побитовые операции & и | имеют более низкий приоритет, чем "обычные" операции сравнения типа ==, так что, несмотря на, казалось бы, очевидный порядок выполнения, выражение:

if (x&MASK == BITS)

На самом деле выполнится как:

? if (х & (MASK==BITS))
?

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

if ((x&MASK) == BITS)

Даже если скобки в выражении не обязательны, они могут помочь сгруппировать операции так, чтобы фрагмент кода стал понятен с первого взгляда. В следующем примере проверки високосности года по его номеру в использовании скобок нет жесткой необходимости:

? lеар_уеаг = у % 4 == 0 && у % 100! = 0 | | у % 400 == 0;

Но с ними фрагмент станет гораздо проще для понимания:

lеар_уеаг = ((у%4 == 0) && (у%100!= 0)) | (у%400 ==0);

Мы убрали здесь некоторые пробелы: группировка операций с самым высоким приоритетом помогает читателю быстрее разобраться в структуре программы.

Разбивайте сложные выражения.
Языки С, C++ и Java имеют богатый и разнообразный синтаксис, поэтому многие увлекаются втискиванием всего подряд в одну конструкцию. Приведенное выражение весьма компактно, однако в нем содержится слишком много операторов:

*х += (*xp=(2*k < (n-m)? c [k+1]: d[k--]));

Если разбить это выражение на несколько, оно станет гораздо более удобочитаемым:

if (2*k < n-m)
*хр = c[k+1j;
else
*xp = d[k--];
*x += *xp;

Будьте проще.
Безудержная энергия программистов иногда направляется на то, чтобы написать наиболее краткий код или достичь результата самым хитрым и красивым способом. Иногда, впрочем, эти таланты тратятся впустую: настоящая задача в том, чтобы написать код попроще, а не похлеще. Вот, к примеру, что делает это замысловатое выражение?

? subkey = subkey >> (bitoff – ((bitoff " 3) " 3));

Самое внутреннее выражение сдвигает bitoff на три бита вправо. Результат сдвигается обратно влево, при этом три сдвинутых бита замещаются нулями. Затем результат вычитается из первоначального значения, оставляя три младших бита bitoff, которые используются для сдвига subkey вправо.

Таким образом, приведенная конструкция эквивалентна:

subkey = subkey >> (bitoff & 0x7);

Над первой версией приходится гадать некоторое время, чтобы понять, что там происходит; со второй же все просто и ясно. Опытные программисты записали бы ее еще короче:

subkey >> = bitoff & 0x7;
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.