Цитата(Злодей @ Feb 15 2009, 20:41)

Окончания U ... это ... помощь компилятору?
В данном конкретном случае этого можно было и не делать (явно не указывать тип и размерность констант). Я просто привык (пару раз наступил на грабли) и считаю, что если ты знаешь тип и размерность константы (а знаешь ты это почти всегда) и она отлична от int или эта константа участвует в формуле, в которой возможен выход за диапазон типа int, то использование суффиксов U L UL f обязательно!
Цитата
Тогда определить MSB можно так:
#define MSB( X ) ( ( X & ( 1 << ( 8 * sizeof( X ) ) ) ) ? 1 : 0 )
так короче
Код
#define MSB(X) (((X) & (1 << (8*sizeof(X)))) != 0)
Поясню: результатом любой логической операции уже является числом 0 или 1. И также справедливо утверждение, что любое выражение само может быть объектом логической операции.
Поэтому, совершенно нормально и адекватно писать так:
Код
n = a + b - (y==x);
или даже так
Код
if ((a=b)) {...}
- тут происходит присвоение 'а' к 'б', а потом проверка на неравенство нулю результата выражения, т.е. (a!=0) (скобочки двойные, чтоб указать, что тут не опечатка и тут не имелось в виду а==b ).
Цитата
Обращаю внимание (сам долго смотрел на пример и не замечал)...
Вы бы лучше обратили внимание, на то, что аргументы передаваемые в макрос должны быть взяты в скобки в теле макроса.
Об этом во всех учебниках толдычат и не зря.
Почувствуйте разницу:
Код
#define GOOD_MACRO(X) ((X)*(X))
#define BAD_MACRO(X) (X*X)
static const int A = 1;
int a = GOOD_MACRO(A+1); // результат = (A+1)*(A+1) = 2*2 = 4
int b = BAD_MACRO(A+1); // результат = A+1*A+1 = 1+1+1 = 3