Большинство ответов здесь сосредоточены на эффекте подстановки макросов. Но я думаю, что он хотел знать,
32768 / 10
оценивается во время компиляции. Прежде всего, это арифметическое константное выражение и, кроме того, интегральное константное выражение (потому что оно имеет только литералы целочисленного типа). Реализация может вычислять его во время выполнения, но также должна иметь возможность вычислять его во время компиляции, потому что
- он должен выдавать диагностическое сообщение, если константное выражение не представимо в типе, который имеет его выражение
- такие выражения разрешены в контекстах, которые требуют значения во время перевода, например, если они используются в качестве размера измерения массива.
Если компилятор в принципе может вычислить результат уже во время компиляции, он должен использовать это значение, а не пересчитывать его во время выполнения, я думаю. Но, возможно, есть еще причина для этого. Я бы не знал.
Редактировать : Извините, я ответил на вопрос, как если бы он был о C ++. Сегодня вы обратили внимание на вопрос о C. Переполнение в выражении считается неопределенным поведением в C, независимо от того, происходит ли оно в константном выражении или нет. Второй пункт также верно и в Си, конечно.
Редактировать : В примечании к комментарию, если макрос подставляется в выражение, подобное 3 * TIMER_100_MS
, тогда это будет оценивать (3 * 32768) / 10
. Следовательно, простой и прямой ответ: «Нет, это не будет происходить во время выполнения каждый раз, потому что деление может вообще не происходить из-за правил приоритета и ассоциативности» . В моем ответе выше предполагается, что макрос всегда подставляется так, что на самом деле происходит деление.