1.C语言中如何引用一个已经定义的全局变量?
Answer:①引用头文件的方式;②引用extern关键字。
注:※⑴如果引用头文件方式引用某个在头文件中声明的全局变量,在写入头文件名称时若出现错误书写,那么在编译期间则会报错。
※⑵如果引用extern关键字,如果将名称写错,则在编译期间不会报错,而在连接时报错。
2.全局变量可以定义在被多个.C文件包含的头文件中吗?为什么?
Answer:可以。在不同的C文件中以static形式来声明同名全局变量。在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件对于此变量赋初值,此时连接不会出错。简而言之就是初始赋值只能有一次,可以多次声明。
3.static修饰的全局变量和普通的全局变量有什么区别?局部变量呢?函数呢?
Answer:
①全局变量加上static修饰后,改变了其作用域,限制了该变量的使用范围----->全局变量本身是静态的存储方式,加上static仍然是静态存储,存储方式并未改变。未加static修饰符的全局变量在各个源文件内都是有效的,而static则限定了只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用该变量。
②局部变量加上statoc修饰后,改变了其存储方式,或称其改变了变量的生存周期----->局部变量存储在栈区上,出了当前代码段(作用域或调用函数的函数体)时则被销毁,而static修饰的局部变量则存放在静态区,生存周期直至程序的结束才被销毁。static修饰的局部变量只能被初始化一次,下一次依据上一次的结果值。③函数体加上static修饰后,作用域发生了改变,仅在本文件中有效----->static修饰的函数在内存中只有一份,而普通函数在每次调用时维持一份拷贝。
4.int a=5;a=(a=3*5,a*4),a+5;问a为多少?
题很简单,但是要注意陷阱。运算符的优先级问题就是此处的陷阱,赋值运算符优先于逗号运算符,括号运算符优先于赋值运算符。所以a=15*4=60,答案为60,要是加上后来的5,那就跳进“坑”里了。
5.C语言中的宏和函数有什么不同?
Answer:
①.宏在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测。
②.宏进行定义时不会考虑参数的类型,即便是将类型指定为形参也可,宏的参数只是原样替换而已,而函数指定了参数类型后,只得按照定义的类型传参。
③.宏的使用会使具有同一作用的代码块在不同地方会产生多个副本,即会增长目标文件的大小,大量使用宏会使代码变的冗长而繁琐,而函数调用则只拷贝一份。
④.宏的运行速度会比函数快,如果函数调用和返回所消耗的时间与执行函数该模块相当,或远大于执行的时间,则使用宏不失为一种快速简便的方法。
⑤.因为宏在编译时不会进行任何逻辑检测,所以在使用时在相应的参数位置应当多加括号以确保优先级的执行顺序。
⑥.函数的参数可以传递指针(地址),也可以传递具体的数值,而宏只是直接的替换。
⑦.程序调试时,函数可以调试,但宏不可调试,编译阶段宏便不复存在,直接替换完成。