Правила программирования на С и С++. Главы 1-6 - Операция ?: не то же самое, что и оператор if/else

ОГЛАВЛЕНИЕ

81.1. Операция ?: не то же самое, что и оператор if/else.

Последняя строка в таблице 1 относится к другому спорному вопросу. Условная операция - это простой оператор. Она используется лишь в выражении и передает значение. Условная операция является не очень привычной заменой для оператора if/else, но не менее, чем операции ?? или || приемлемы для замены простого if. Хотя большинство людей и не принимают во внимание замену:

if ( z ) i = j;else i = k;на: z ?? (i = j);

z || (i = k);

Мне довелось случайно увидеть подобное этому, но с использованием условной операции: z ? (i = j) : (i = k) ;Все предыдущие фрагменты в равной мере способны сбить с толку. Следующий код показывает, как надлежащим образом использовать условную операцию, и ее результат яснее (т.е. лучше), чем у равноценного оператора if/else: i = z ? j : k ;

81.2. Помещайте тело макроса и его аргументы в круглые скобки.

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

#define TWO_K 1024 + 1024что при использовании в: 10 * TWO_Kрасширяется до: 10* 1024 + 1024вычисляемого как: (10 * 1024) + 1024Решаем эту задачу при помощи круглых скобок: #define TWO_K (1024 + 1024)Вот сходная задача в следующем фрагменте кода: #define SQUARE(x) (x * x)Определено: SQUARE(y + 1);что расширяется макросом до: y + 1 * y + 1и вычисляется как: y + (1 * y) + 1И вновь круглые скобки приходят на помощь. Следующее определение: #define SQUARE(x) ((x) * (x))расширяется до: ((y + 1) * (y + 1))