#c
#c
Вопрос:
Я не знаю, почему появляется этот вывод и поведение препроцессора.
Вывод:
the value in main 10
the value in fun 20
the value in 2 main 10
Источник
#include<stdio.h>
#define MAX 10
int fun(int a);
int main()
{
int a;
a=MAX;
printf("the value in main =%dn",a);
fun(a);
int b;
b=MAX;
printf("the value in 2 main =%dn",b); /*<----doubt at this line*/
}
Что происходит, когда мы присваиваем новое значение макросу внутри локальной функции, почему он не обновляется вне функции?
int fun(int a)
{
#undef MAX
#define MAX 20
a=MAX;
printf("the value in 2 main =%dn",a);
}
Комментарии:
1. Это все в одном файле? Каков порядок main и fun в файле?
2. Не ясно, в чем ваша проблема. Возможно, вы захотите прочитать, что такое макросы и как работают предварительные процессоры. Подсказка: у него нет понятия области действия.
3. да, все в одном файле только в main() я вызываю fun().
Ответ №1:
Макрос не проверяется во время выполнения. Он проверяется во время компиляции перед компиляцией на этапе, называемом предварительной обработкой.
Итак, компилятор main
сначала обрабатывает функцию и заменяет MAX
на 10 во всех строках. Затем, когда он достигает fun
функции, он отменяет MAX
и переопределяет ее на 20 и заменяет строки на fun
20.
Комментарии:
1. …и использует значение
20
forMAX
во всех последующих строках модуля компиляции.2. но в функции я меняю значение MAX. почему это не отражение в main после переопределения в функции? максимальное значение заменяется новым значением wright?
3. Как я уже сказал, макрос не заменяется во время выполнения. Это означает, что он следует не за выполнением программы, а за порядком, в котором макросы определены в файле. Чтобы увидеть это, вы можете написать
fun
функцию над main, но ниже#define MAX 10
. В этом случае все операторы printf будут иметь значение 20.
Ответ №2:
Конечно, вы написали код для функции fun после основной.
Компилятор изменяет определенные макросы для соответствующих значений в том порядке, в котором он их находит в исходном коде, а не в порядке выполнения.