首页 > 试题广场 >

以下代码的输出结果是?

[单选题]
以下代码的输出结果是?
#include <stdio.h>
#define a 10 

void foo();  
int main(){ 
   printf("%d..", a); 
   foo(); 
   printf("%d", a); 
} 
void foo(){ 
   #undef a 
   #define a 50 
}
  • 10..10
  • 10..50
  • Error
  • 0
选A,define在预处理阶段就把main中的a全部替换为10了.
另外,不管是在某个函数内,还是在函数外,define都是从定义开始知道文件结尾,所以如果把foo函数放到main上面的话,则结果会是50 ,50
编辑于 2015-04-13 20:23:28 回复(6)
#define a 10
void foo();
void prin();

int main()
{
    prin();
    printf("%d ", a);
    foo();
    printf("%d ", a);
    
}
void foo()
{
#undef a
#define a 50
}
void prin()
{
    printf("%d ", a);
}
上面代码输出 50 10 10,可以看出define只是在预处理阶段将a替换为相应数值,具体替换的值只与define在文件中的位置有关,与是否在函数内无关。
发表于 2015-12-01 08:49:58 回复(5)
A是正确答案。
宏定义是在编译器预处理阶段中就进行替换了,替换成什么只与define和undefine的位置有关系,与它们在哪个函数中无关
以本题为例:#define a 10 到 #undef a之间的代码在预处理阶段就将a全部换为10,#define a 50后面的代码会将a替换为50。
如果没有#define a 50后面再使用a,编译器就会报错了。

发表于 2015-10-19 14:16:34 回复(1)
处理#define的时候,忽略代码的逻辑。
发表于 2015-06-30 10:01:06 回复(0)
如果只是单单上面的代码  编译错误
如果是下面两种情况,运行正确

##############################
#define a 10

void foo();  // 函数声明

int main(){
   printf("%d..",a);
   foo();
   printf("%d",a);
}

void foo(){
   #undef a
   #define a 50
}

/out:Excersizes.exe
Excersizes.obj
10..10[Finished in 0.4s
##################################
#define a 10

void foo(){
   #undef a
   #define a 50
}
int main(){
   printf("%d..",a);
   foo();
   printf("%d",a);
}

/out:Excersizes.exe
Excersizes.obj
50..50[Finished in 0.5s]
####################################
发表于 2015-04-14 01:19:56 回复(0)

图片说明

图片说明 对于宏定义是在.c文件变成.i文件时进行的字符串替换的过程。

发表于 2017-03-30 20:50:19 回复(0)
define替换发生在预编译阶段,而且就是从#define开始直到#undef中间替换,且忽略代码逻辑。如果没有#undef,就直到文件末尾。
发表于 2017-01-18 09:21:06 回复(0)
从第一行到第10行,a为10;从第12行开始,a为50。
与逻辑没有关系,预处理按照从上到下。
发表于 2016-06-11 15:21:43 回复(1)
对于#define和#undef的宏定义,是在预编译阶段就进行处理的。
#define a 10 编译器并不考虑函数执行的过程,仅仅是在#define开始到文件结束或#undef内都是有效的。
而#undef a  #define a 50,作用域是接下来的代码。
发表于 2015-08-06 23:50:08 回复(0)

在代码的开头,宏定义了a为10。所以,在main()函数中的第一个打印语句printf("%d..", a)会输出10..。

然后,foo()函数被调用。在foo()函数中,先使用#undef取消了宏a的定义,然后重新使用#define将a重新定义为50。

但是,在foo()函数内部对宏的重新定义只在该函数内部有效,作用域仅限于该函数。所以,在foo()函数调用结束后,在main()函数中的第二个打印语句printf("%d", a)仍然会输出全局作用域下的宏定义结果,即10。

因此,整个程序的输出结果是10..10。

发表于 2023-10-18 22:33:04 回复(1)
全局变量与局部变量同名时,在局部变量作用域全局变量被覆盖,离开局部作用域局部变量不起作用
发表于 2017-08-20 09:20:18 回复(0)
用上边路人甲的代码解释一下就是:
宏定义是从开头到结尾的,在预处理阶段替换,这时候还没有编译运行,所以和在不在函数内无关,所以1-15行的a直接变成10,然后16行之后的a直接替换成50,运行主函数里先打印50,10,然后调用foo()函数,相当于一个空函数体,啥都不执行,然后运行程序就得出结果了50 10 10
编辑于 2022-04-18 20:27:48 回复(0)
最开始预编译有一个是#define a 10 函数调用有一个 #undef a #define a 50 (调用这个函数时,会有一个判断,如果前面宏定义已经定义a,所以这里面的#define a50不会被执行。a还是预编译时的10)
发表于 2021-10-04 12:10:34 回复(0)
宏定义常量在预编译时做简单的替换,替换的范围只与#define和#undef的位置有关

#define a 10
void foo(); 
void main(){
  printf("%d..",a);   //a在预处理阶段替换为10
   foo();
   printf("%d",a);    //a在预处理阶段替换为10
}
void foo(){
   #undef a
   #define a 50
}
void fun()
{
    printf("%d",a);  //a在预处理阶段替换为50
}

编辑于 2019-06-05 10:23:11 回复(0)
发表于 2015-04-13 23:19:57 回复(0)
宏定义是在预编译阶段展开的,他是按照文本内容从上到下,而不是按照程序执行顺序展开,这个时候没有执行一说,所以foo()函数放的位置对这个影响很大
发表于 2023-12-15 11:09:01 回复(0)
这个foo是只用一次吗?
发表于 2023-10-08 20:33:46 回复(0)
该程序的输出结果是 "10..10"。在程序中,宏定义a被设置为10,在主函数中先打印出a的值,然后调用foo()函数。foo()函数取消了宏定义a,并将a重新定义为50。但是,这个改变只在foo()函数内部有效,一旦foo()函数执行结束,宏定义a就会恢复到原始状态即10。因此,在主函数中打印a的值时输出结果为10,之后再次打印a的值同样是10。
发表于 2023-04-25 22:31:53 回复(0)
Define和undefined之间a为10
发表于 2022-11-14 19:51:21 回复(0)
发表于 2022-07-17 20:04:18 回复(0)