Директивы препроцессоров в c : каков результат следующего кода?

#c #preprocessor-directive

#c #директива препроцессора

Вопрос:

Студент здесь. У меня есть следующий фрагмент кода, и я в замешательстве по поводу его вывода. Когда я запускаю этот код, он сообщает мне, что C будет равно 2, но я думаю, что это будет 0. Почему это 2? Ty!

 #include <iostream>
using namespace std;

#define A    0
#define B    A 1 
#define C    1-B

int main() {
cout<<C<<endl;
return 0;
}
 

Комментарии:

1. #define инструкции — это просто простые текстовые замены, выполняемые препроцессором, поэтому C они будут заменены на 1-0 1 , что равно 2 при оценке компилятором. Попробуйте #define B (A 1) или #define C 1-(B) вместо этого, затем C будет заменен на 1-(0 1) , который будет оцениваться как 0.

2. Сравните с #define C 1-(B) .

3. черт возьми, это не только вас смущает.

4. Потому что вы оцениваете выражение после его полного расширения 🙂

5. Это хорошая причина НЕ использовать #define константы for, вместо этого используйте фактические константы языка C , например: const int A = 0; const int B = A 1; const int C = 1-B;

Ответ №1:

Главное здесь то, что вы ожидаете B , что будет оценено до A . Это верно для обычного кода на C , но препроцессор просто заменяет директиву ее содержимым.

В этом случае это происходит следующим образом.. Возьмите:

 cout<<C<<endl;
 

Замените C на 1-B :

 cout<<1-B<<endl;
 

B -> A 1

 cout<<1-A 1<<endl;
 

A -> 0

 cout<<1-0 1<<endl;
 

В соответствии с обычными правилами C приоритет операторов - и равны и ассоциируются слева направо, так что, 1 - 0 1 есть 2 .

Ответ №2:

С помощью gcc используйте флаг -E, чтобы увидеть результат после предварительной обработки.

Удалите includes и остальной код, чтобы увидеть результат этого:

 #define A    0
#define B    A 1 
#define C    1-B

A
B
C
 

чтобы получить:

 0
0  1
1-0  1
 

Препроцессор предназначен только для замены текста. Если вы хотите определить константы, тогда определите константы:

 const int A = 0;
const int B = A 1;
const int C = 1-B;