2015-10-23 2 views
-2

Когда я скомпилировать следующую программу я получаю выход в 47. Я ожидал, что выход будет 144C - Неожиданный выход с #define

#include<stdio.h> 
#define FIRST_PART 7 
#define LAST_PART 5 
#define ALL_PARTS FIRST_PART + LAST_PART 
int main() { 
printf ("The Square of all parts is %d", ALL_PARTS * ALL_PARTS) ; 
return(0); 
} 
+0

Добро пожаловать в SO! Попробуйте свести к минимуму пример и уточните название: неожиданно? –

+0

Используйте свои настройки компилятора для вывода предварительно обработанного файла. Вы обнаружите, что ваши ожидания ошибочны, так как это правильно рассчитано как '7 + 5 * 7 + 5', что действительно' 47'. – usr2564301

ответ

1

Препроцессор работает до компилятора. Это простой «глупый» механизм замены текста. Поэтому:

  • ALL_PARTS конвертируется в 7 + 5

  • ALL_PARTS * ALL_PARTS конвертируется в 7 + 5 * 7 + 5.

Из-за этого механизма, рекомендуется окружать параметры макросов со скобками, а также окружать весь макрос со скобками, например:

#define ALL_PARTS (FIRST_PART + LAST_PART)

0
ALL_PARTS * ALL_PARTS 

Станет

FIRST_PART + LAST_PART * FIRST_PART + LAST_PART 

Что такое

7 + 5 * 7 + 5 = 7 + 35 + 5 = 47 

So 47 is Ожидаемый ответ.

Если вы хотите увидеть ваш ожидаемый результат, вам необходимо добавить к вашему ()define

#define ALL_PARTS (FIRST_PART + LAST_PART) 
1

FIRST_PART + LAST_PART будет оценивать, как 7 + 5 (Не более подстановку текста).

Вы имеете выражение 7 + 5 * 7 + 5, которое равно 7 + 35 + 5 (поскольку умножение имеет более высокий приоритет, чем дополнение). Разумеется, значение 7 + 35 + 5 составляет 47.

В качестве определения вы должны использовать (FIRST_PART + LAST_PART).

0

Ваш Препроцессор оценивается как

printf ("The Square of all parts is %d", ALL_PARTS * ALL_PARTS) ; 

затем

printf ("The Square of all parts is %d", FIRST_PART + LAST_PART * FIRST_PART + LAST_PART) ; 

, а затем

printf ("The Square of all parts is %d", 7 + 5 * 7 + 5) ; 

Так что ваш конечный результат 47

Чтобы получить желаемый RESU л вы можете использовать

#define ALL_PARTS (FIRST_PART + LAST_PART) 
0

Просто нужно изменить:

#define ALL_PARTS FIRST_PART + LAST_PART 

Для этого:

#define ALL_PARTS (FIRST_PART + LAST_PAR) 
0

FIRST_PART 7 LAST_PART 5

FIRST_PART + LAST_PART 7 + 5

7 + 5 * 7 + 5 = 7 + 35 + 5 = 47

Чтобы исправить, сделать

#define ALL_PARTS (FIRST_PART + LAST_PART) 
0

Ваш код расширен до 7 + 5 * 7 + 5 = 7 + 35 + 5 = 47. Это очень частой провал.

Смежные вопросы