Поскольку 2 + 3
подставляется буквально в выражении x * x
, оно становится 2 + 3 * 2 + 3
, а оператор *
имеет более высокий приоритет, поэтому вы не получите ожидаемый результат.
Всегдазаключите аргументы макроса и все выражение в круглые скобки, чтобы избежать этого:
#define SQUARE(x) ((x) * (x))
Также обратите внимание, что любое переданное вами выражение будет оцениваться дважды, и это может быть нежелательным, если у выражения есть побочный эффект, такой как присваиваниеили вызов функции.В этих случаях лучше использовать встроенную функцию.