47. 下列哪些写法是对的,而且是常量。
A -0.456 B 1.25E+20 C AB' D 0xabcdef
48. 设有如下定义: char *s[2]={“abcd”,“ABCD”}; 则下列说法正确的有_____
A s数组元素的值分别是“abcd”和“ABCD”两个字符串的首地址 B \\ ns是指针数组名,它含有两个元素分别指向字符型一维数组 C s数组的两个元素分别存放的是含有四个字符的一维字符数组中的元素 D \\ ns数组的两个元素中分别存放了字符’a’和’A’的地址
49. 以下关于typedef的叙述,正确的是
A 用typedef可以定义各种类型名,但是不能定义变量。 B 用typedef可以增加新类型。
C 用typedef只是将已存在的类型用一个新名字来表示。 D 使用typedef可以提高程序的通用性。
50. C语言的sleep,wait,delay函数的主要区别
A delay()和sleep()都是用于短暂延时,二者的主要区别在于delay()是循环等待,该进程还在运行,占用处理器的时间片,也就是进程忙等待
B sleep()则不同,调用sleep()的进程会被操作系统挂起,把处理器让给其他的进程,也就是进程空闲等待
C wait()与delay()和sleep()有着更本质的区别,它是用于等待子进程的返回 D AB正确
delay()是循环等待,该进程还在运行,占用处理器。 sleep()不同,它会被挂起,把处理器让给其他的进程。 sleep()参数指定暂停时间,单位是s delay()参数指定暂停时间,单位是ms
51. 以下说法不正确的是
A 定义函数时,形参的类型说明可以放在函数体内 B return后边的值不能为表达式
C 如果函数值的类型与返回值表达式的类型不一致,以函数值类型为准 D 如果形参与实参的类型不一致,以实参类型为准
52. 使用全局数据的有益做法
A 使用访问器子程序来存取全局数据 B 为全部的全局变量创建一份注释良好的清单 C 用全局变量来存放中间结果
D 将数据放在一个大对象中并到处传递,以满足不使用全局变量的要求 E 库代码中避免使用非只读的全局变量
53. 下列对const与#define用法说明正确的是
A const可以定义常量;#define也可以定义常量。
B const可以修饰函数的参数和返回值,但是不可以修饰函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
C const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查。
D 宏常量在字符替换中可能会产生意料不到的错误(边际效用)。有些集成化的调试工具可以对const常量进行调试,但不能对宏定义常量进行调试。
54. 下列对__attribute__相关语法及其使用正确的是
A __attribute__语法格式为:__attribute__ ((attribute-list)) B __attribute__的位置约束为:放于声明的尾部,“;”之前。 C __attribute__适用于函数的声明而不是函数的定义
D 关键字__attribute__也可以对变量或结构体成员进行属性设置
判断题
1. 任何一个IP设备的路由表中,必须要有一条默认路由的,这样才能知道默认数据发往哪里。√
2. 枚举是一种基本数据类型,枚举变量的取值是有限的,枚举元素是常量,不是变量。√ 3. 全局static变量和字符串常量位于数据段(或BSS段),而局部static变量位于栈中。× 4. 定义const char *ptrStr; 表示ptrStr为一个字符指针,指向的内容不能改变。√ 5. 结构体的长度等于各成员长度的和。×
6. n维数组的本质是一维数组。√
7. 在C源程序文件中,若要定义一个只允许源文件中所有函数使用的全局变量,则该全局变量应该定义为static类型的。√
8. 对”double *const cptr;”C语言类型声明语句的正确解释是cptr指向的地址不能改变。√
9. C语言中用volatile关键字修饰的变量只能在当前的.c文件中使用。× 10. 若x为某函数f之内定义的变量,则当函数f执行完后,x自动销毁。×
11. 程序编译分为预编译、汇编、编译和链接四个阶段。在编译阶段,编译器将源代码翻译为机器码,并确定各符号的入口地址。× 12. int a = 5, b = 3; !a&&b++执行后,b=4。×
13. 凡是C源程序中行首以\标示的控制行都是预处理指令。√
14. 如果函数的参数是一个结构体,我们应该在参数中传入结构体的地址,而不是结构体变量本身。√
15. typedef char* PSTR;const PSTR p;那么p表示的是一个指向常量的指针。× 16. 在C语言中,函数定义不可以嵌套,但函数调用可以嵌套。√ 17. 全局变量存储在全局变量存储区,局部变量存储在堆栈。√ 18. 指针在任何情况下都可进行>, <, >=, <=, ==, !=运算。×
19. 在A文件中定义了全局变量int a[100],在B文件中使用extern int *a来引用,这样做是否正确? ×
20. 使用全局变量的函数具备天然的不可重入性。√
21. 在C语言中,X=X+1,X+=1以及X++三个语句中,效率最高的为X++,其次为X=X+1,效率最低的为X+=1。×
附件
1.关于const
请分清数值常量和指针常量,以下声明颇为玩味: int ii=0;
const int i=0; //i是常量,i的值不会被修改
const int *p1i=&i; //指针p1i所指内容是常量,可以不初始化 int * const p2i=ⅈ //指针p2i是常量,所指内容可修改 const int * const p3i=&i; //指针p3i是常量,所指内容也是常量 p1i=ⅈ //合法 *p2i=100; //合法 为什么使用const?
采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)
用法1:常量
取代了C中的宏定义,声明时必须进行初始化。const限制了常量的使用方式,并没有描述常量应该如何分配。如果编译器知道了某const的所有使用,它甚至可以不为该const分配空间。最简单的常见情况就是常量的值在编译时已知,而且不需要分配存储。―《C++ Program Language》 用const声明的变量虽然增加了分配空间,但是可以保证类型安全。 C标准中,const定义的常量是全局的,C++中视声明位置而定。
用法2:指针和常量
使用指针时涉及到两个对象:该指针本身和被它所指的对象。将一个指针的声明用const“预先固定”将使那个对象而不是使这个指针成为常量。要将指针本身而不是被指对象声明为常量,必须使用声明运算符*const。
所以出现在 * 之前的const是作为基础类型的一部分: char *const cp; //到char的const指针 char const *pc1; //到const char的指针
const char *pc2; //到const char的指针(后两个声明是等同的) 从右向左读的记忆方式: cp is a const pointer to char. pc2 is a pointer to const char.
用法3:const修饰函数传入参数
将函数传入参数声明为const,以指明使用这种参数仅仅是为了效率的原因,而不是想让调用函数能够修改对象的值。同理,将指针参数声明为const,函数将不修改由这个参数所指的对象。 通常修饰指针参数和引用参数:
void Fun( const A *in); //修饰指针型传入参数 void Fun(const A &in); //修饰引用型传入参数
用法4:修饰函数返回值
可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。
用法5:const修饰成员函数
const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数; const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。
2.static的用法:
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。 用法1:函数内部声明的static变量,可作为对象间的一种通信机制
如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它的定义使初始化。 用法2:局部静态对象
对于局部静态对象,构造函数是在控制线程第一次通过该对象的定义时调用。在程序结束时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。 用法3:静态成员和静态成员函数
如果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。同理,一个需要访问类成员,而不需要针对特定对象去调用的函数,也被称为一个static成员函数。 类的静态成员函数只能访问类的静态成员(变量或函数)。
3.extern的用法:
extern可以声明其他文件内定义的变量。在一个程序里,一个对象只能定义一次,它可以有多个声明,但类型必须完全一样。如果定义在全局作用域或者名字空间作用域里某一个变量没有初始化,它会被按照默认方式初始化。
将变量或函数声明成外部链接,即该变量或函数名在其它函数中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。
在C++中,还可以指定使用另一语言链接,需要与特定的转换符一起使用。 extern “C” 声明语句 extern “C” { 声明语句块 }
4.volatile的用法:
类型修正符(type-modifier),限定一个对象可被外部进程(操作系统、硬件或并发进程等)改变。volatile与变量连用,可以让变量被不同的线程访问和修改。声明时语法: int volatile vInt;
常用于像中断处理程序之类的异步进程进行内存单元访问。 除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。
注意:可以把一个非volatile int赋给volatile int,但是不能把非volatile对象赋给一个volatile对象。 一个有volatile标识符的类只能访问它接口的子集,一个由类的实现者控制的子集。用户只能用const_cast来获得对类型接口的完全访问。此外,volatile向const一样会从类传递到它的成员。 FAQs:
1.static有什么用途?(请至少说明两种)