Что-то, что я не видел, чтобы кто-то упомянул, это то, что даже полная скобка определений макросов не решает полностью проблему.
Вопрос имеет:
#define BIG_INTERVAL 60 * 60 * 1000
(иОпрашивающий признает, что отсутствие скобок является проблемой).Но даже с:
#define BIG_INTERVAL (60 * 60 * 1000)
каждая из констант (60, 60 и 1000) определенно представляется как целое число, но продукт равен 3600000, в то время как язык гарантирует, что INT_MAX >= 32767
.
Язык говорит, что большие целочисленные константы имеют тип, достаточно большой, чтобы содержать их значения (например, 100000
может иметь тип int
или тип long int
, в зависимости от диапазонов этих типов), но у него нет такого правила для выражений, даже константных выражений.
Вы можете обойти это следующим образом:
#define BIG_INTERVAL (60L * 60L * 1000L)
, но это делает его типом long
, даже если онне должен быть.
Что касается вопроса приоритета оператора, вот мой любимый пример:
#include <stdio.h>
#define SIX 1+5
#define NINE 8+1
int main(void)
{
printf("%d * %d = %d\n", SIX, NINE, SIX * NINE);
return 0;
}
Вывод, конечно,
6 * 9 = 42
(см. Дуглас Адамс).