#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;