标准C语言问答题
注:以下问题请根据联机文档和课程视频的讲解独立完成,要求本文档在全部完成后提交,由辅导教师进行批改。回答问题时请将答案填写在蓝色答:之后。
注册名:
1.1.1 C语言概述 (ch1)
1) C语言起源于那一年,C语言的发明者是谁?
答:
2) 详细描述C语言的优势。
答:
3) 简述C语言的未来发展方向。
答:
4) 简述C语言的不足。
答:
5) 简述C语言的两个标准。
答:
1.1.2 数据 (ch2)
1) C语言中,基本数据类型有几个,请分别加以描述。
答:
2) 字符类型也属于C语言整型家族,并且分为有符号(singed)和无符号(unsigned)
两种版本。这个判断对吗? 答:
3) C语言有布尔类型吗?请加以说明。
答:
4) 简述整型的长度和机器字长的关系。
答:
5) 长整型至少应该和整型一样长,而整型至少应该和短整型一样长。这句话对吗?
答:
6) 整数用八进制来表示和用十六进制来表示时,开头的标识是什么?
答:
7) value = value – 48; value = value – ’\\60’; value = value - '0'; 这
三条语句相等吗? 答:
8) 枚举类型的变量实际上以整型的方式存储,例如:enum Jar_Type{CUP = 8, PINT =
16, QUART, HALF_GALLON, GALLON=128}; 这种只对部分符号名赋值合法吗? 答:
9) 在上面定义的枚举类型变量Jar_Type中,QUART, HALF_GALLON 的值分别是多少?
答:
10) 浮点数家族包括哪几种类型?
答:
11) 标准中针对浮点数定义的FLT_MAX, DBL_MAX和LDBL_MAX这三个常量,具体含义是
什么,是在那个系统头文件中定义的。 答:
12) C语言中的字符串,通常存储在字符数组中,它的结束标志是什么?请描述该结束标志
的具体含义。 答:
13) 字符串常量中,\"\" 字符串的含义是什么?
答:
14) 当一个字符串常量出现于一个表达式中时,如:printf(\"%s\\n\\"Original
input.\"); 表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。这句话对吗? 答:
15) C语言中,数组的下标总是从0开始,还是从1开始?
答:
16) C编译器一般并不检查程序对数组下标的引用是否在数组的合法范围内,所以防止因数
组越界而产生的非法访问都是程序员自己的事。判断这句话的正确性,请给出一个例子程序加以验证。 答:
17) C语言支持一种叫作typedef的机制,它允许你为各种数据类型定义新名字:char
*ptr_to_char; typedef char *ptr_to_char; ptr_to_char a; 请给出这三个声明的解释。 答:
18) const变量的赋值方法:首先,可以在声明时对它进行初始化,如int const a = 15;
其次,在函数中声明为const的形参在函数被调用时会得到实参的值。请问,还有其它方式或场合可以对一个const变量进行赋初值吗? 答:
19) 以下指针变量的const属性:int const *pci; int *const cpi; int const
*const cpci; 请详细描述三者的区别。 答:
20) #define指令是另一种创建名字常量的机制, #define MAX_ELEMENTS 50 (注意:
#define语句之后没有”;”),int const max_elements = 50; 请给出二者在存储概念上的区别。 答:
21) 标识符的作用域就是程序中该标识符可以被使用的区域,C编译器可以确认4种不同类
型的作用域 -- 文件作用域、函数作用域、代码块作用域和原型作用域。请分别给出示例对这四种标识符的作用域加以描述。 答:
22) 位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识
符都具有代码块作用域(block scope), 表示它们可以被这个代码块中的所有语句访问。请判断上述描述的正确性。 答:
23) 任何在所有代码块之外声明的标识符都具有文件作用域(file scope), 它表示这些标
识符从它们的声明之处直到它所在的源文件结尾处都是可以访问的。请判断上述描述的正确性。
答:
24) 链接属性一共有3种 -- external(外部)、internal(内部)和none(无)。请分
别对这三种链接属性用示例加以说明。 答:
25) 关键字extern和static用于在声明中修改标识符的链接属性,如果某个声明在正常
情况下具有external链接属性,在它前面加上static关键字可以使它的链接属性变为internal. static只对缺省链接属性为external的声明才有改变链接属性的效果。请判断上述描述的正确性,并用示例加以说明。 答:
26) 变量的存储类型(storage class)是指存储变量值的内存类型。有三个地方可以用于
存储变量,请给出这三个地方的具体名称。 答:
27) 凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是属于堆栈的内存,这
类变量称为静态(static)变量。这句话对吗? 答:
28) 静态变量在程序运行之前创建,在程序的整个执行期间始终存在。这句话对吗?
答:
29) 在代码块内部声明的变量的缺省存储类型是自动的(automatic). 也就说它存储于堆
栈中,称为自动(auto)变量。在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流程离开该代码块时,这些自动变量便自动销毁。如果该代码块被数次执行,例如一个函数被反复调用,这些自动变量每次将重新创建。请举例说明自动变量的生存周期。 答:
30) 对于在代码块内部声明的变量,如果给它加上关键字static, 可以使它的存储类型从
自动变为静态。这句话对吗? 答:
31) 函数的形式参数可以声明为静态吗?请说明理由。
答:
32) 关键字register可以用于自动变量和静态变量的声明,提示它们应该存储于机器的硬
件寄存器而不是内存中,这类变量称为寄存器变量。这个论述有什么问题,请给出你的
观点。 答:
33) 当用于函数定义、或用于代码块之外的变量声明时,static关键字用于修改标识符的
链接属性,即从external改为internal, 但标识符的存储类型和作用域不受影响。这种方式声明的函数或变量只能在声明它们的源文件中访问。该论述正确吗? 答:
34) 当用于代码块内部的变量声明时,static关键字用于修改变量存储类型,从自动变量
修改为静态变量,但静态的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。该论述正确吗? 答:
1.1.3 语句 (ch3)
1) ANSI C并不具备布尔类型(C99标准虽然添加了_Bool布尔类型,但目前多数编译器
并不支持),那它是使用什么类型来替代的? 答:
2) 在while循环中如果使用break语句,那么执行流下一条应该执行那条语句。
答:
3) 在while循环中也可以使用continue语句,它用于终止当前的那次循环。在执行完
continue语句之后,执行流接下来应当做什么? 答:
4) for语句由初始化部分(只在循环开始时执行一次)、条件部分(在循环体每次执行前都
要执行一次)、调整部分(它在循环体每次执行完毕,在条件部分即将执行之前执行)。所有三部分表达式都是可选的,都可以省略,这样做可以吗? 答:
5) do语句相对于while和for语句的主要不同点在哪?
答:
6) 对于switch语句,switch(expression), 其中expression的结果必须是什么类
型?
答:
7) 在每个switch语句中都放上一条default子句是个好习惯,这样做的理由是什么?
答:
8) 在一般情况下,我们应该尽量避免goto语句。但对于跳出多层嵌套循环的情况下,由
于break语句只影响包围它的最内层循环,要想立即从深层嵌套的循环中退出只有一个办法,就是使用goto语句。谈谈你对这句话的理解。 答:
9) C并不具备任何输入/输出语句:I/O是通过调用系统函数实现的。C也不具备任何异常
处理语句,它们也是通过调用库函数来完成的。这个论断正确吗? 答:
1.1.4 操作符与表达式 (ch4)
1) C提供了所有常用的算术操作符:+ - * / %, 这几个操作符都是既适用于浮点类
型又适用于整数类型。这个论断正确吗? 答:
2) 左移位操作符为 << , 右移位操作符为 >> . 两个操作数都必须是什么类型?
答:
3) C标准说明无符号值执行的所有移位操作都是逻辑位移,但对于有符号值,到底是采用
逻辑位移还是算术位移取决于编译器。请说出逻辑位移和算术位移的区别。 答:
4) 语句 value = value | 1 << bit_number; 实现怎样的功能。
答:
5) 语句 value = value & ~(1 << bit_number); 实现怎样的功能。
答:
6) value & 1 << bit_number; 这个表达式对指定的位进行测试,如果该位已经被设
置为1, 则表达式的结果是什么值? 答:
7) 赋值操作符的结合性(求值的顺序)是从右向左还是从左向右?
答:
8) 当sizeof的操作数是个数组名时,它返回的是什么,长度单位是byte还是bit?
答:
9) 前缀形式的 ++ 操作符出现在操作数的前面,操作数的值被增加,而表达式的值就是操
作数增加后的值。后缀形式的 ++ 操作符出现在操作数的后面,操作数的值仍被增加,但表达式的值是操作数增加前的值。-- 操作符的工作原理也与此相同。++, -- 的前缀形式和后缀形式在执行的效率上有区别吗? 答:
10) 关系操作符:> >= < <= != == , 它们结果是整型值吗?
答:
11) 条件操作符:expression1 ? expression2 : expression3; 首先计算的是
expression1, 如果它的值为真(非零值),那么整个表达式的值就是expression2的值,expression3不会进行求值。如果expression1的值是假(零值),那么整个条件语句的值就是expression3的值,此时expression2会进行求值吗? 答:
12) 请谈谈左值(L-value)和右值(R-value)之间的区别。
答:
1.1.5 指针 (ch5)
1) 通过一个指针访问它所指向的地址的过程称为间接访问(indirection)或解引用指针
(dereferencing the pointer). 这个用于执行间接访问的操作符是单目操作符 * . 可以对一个NULL指针进行解引用操作吗? 答:
2) 对于 int *a; *a = 12; 这是一个极为常见的错误,请解释出错的原因。
答:
3) 标准定义了NULL指针,请谈谈你对NULL指针的认识?
答:
4) int a; *&a = 25; 请解释该语句的含义?
答:
5) int a = 12; int *b = &a; int **c = &b; 这三条语句有没有问题,谈谈看法。
答:
6) 结合《标准C语言教程》 5.11 指针表达式 的内容,重点理解清楚:&cp; *cp; *cp
+ 1; *(cp + 1); ++cp; cp++; *++cp; *cp++; ++*cp; (*cp)++; ++*++cp; ++*cp++; 的具体含义,并给出相应的解释。 答:
7) 结合《标准C语言教程》的 Code 5-3 在一组字符串中查找:版本2 中的代码,解释
*(*strings)++; 语句的具体含义。 答:
1.1.6 函数 (ch6)
1) 函数的定义与函数声明的区别是什么?
答:
2) C函数的所有参数均以传值调用方式进行传递,这样,函数体修改这个参数值时,会修
改调用程序实际传递给它的变量值吗? 答:
3) 如果C函数被传递的参数是一个数组名,并且在函数中使用下标来引用该数组参数,那
么在函数中对数组元素进行修改实际上修改的是调用程序中的数组元素。函数将访问调用程序的数组元素,数组并不会被复制。数组名的值实际上是一个指针,传递给函数的就是这个指针的一份拷贝。这段论述有没有问题? 答:
4) 结合《标准C语言教程》中 Code 6-3a 整数交换:无效的版本 和 Code 6-3b 整数
交换:有效版本,谈谈你对值传递和引用传递的理解,二者之间有什么区别? 答:
5) C通过运行时堆栈支持递归函数的实现。请讲一下堆栈的原理和实际的用途。
答:
6) 追踪一个递归函数执行过程的关键是理解函数中所声明的变量是如何存储的。当函数被
调用时,它的变量的空间是创建于运行时堆栈上的。以前调用的函数的变量仍保留在堆栈上,但它们被新函数的变量所掩盖,因此是不能被访问的。你能否理解掩盖一词在这里的含义?
答:
1.1.7 数组 (ch7)
1) 在C中,在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,这个指针指
向的是什么位置?可以对这个指针直接进行算术运算吗? 答:
2) 在两种场合下,数组名并不用指针常量来表示--就是当数组名作为sizeof操作符或单
目操作符 & 的操作数时。sizeof返回整个数组的长度,而不是指向数组的指针的长度。取一个数组名的地址所产生的是一个指向数组的指针,而不是指向某个指针常量值的指针。针对上述论断,请编写一个例子程序进行验证。 答:
3) 能不能使用赋值符把一个数组的所有元素复制到另一个数组。谈谈你的看法。
答:
4) 下标引用array[subscript]; 和间接访问 *(array + (suybscripy)); 二者在
效果上有区别吗? 答:
5) 声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创
建数组名,数组名是一个常量,指向这段空间的起始位置。请比较数组声明和指针变量声明的区别。 答:
6) 当一个数组名作为参数传递给一个函数时,传递给函数的是参数的一份拷贝(指向数组
起始位置的指针的拷贝),所以函数可以自由地操作它的指针形参,而不必担心会修改对应的作为实参的指针。这个论断正确吗? 答:
7) 函数原型中的一维数组形参无需写明它的元素数目,因为函数并不为数组参数分配内存
空间。形参只是一个指针,它指向的是已经在其它地方分配好内存的空间。这个事实解释了为什么数组形参可以与任何长度的数组匹配--它实际传递的只是指向数组第1个元素的指针。另一方面,这种实现方法使函数无法知道数组的长度。如果函数需要知道数组的长度,它必须作为一个显式的参数传递给函数。你是如何理解以上论述的?
答:
8) 存储于静态内存的数组只能初始化一次,也就是在程序开始执行之前。如果数组未被显
式初始化,数组元素的初始值将会自动设置为零。写一个示例程序进行验证。 答:
9) 请回答自动变量在缺省情况下可以有初始化的值吗?
答:
10) 对于char message[] = \"hello\"; 和 char *message1 = \"hello\"; 请回答
message和message1在存储位置、访问方式上有什么区别? 答:
11) 在C中,多维数组元素的存储顺序是按照什么原则进行?
答:
12) 请给出以下代码的输出,假定matrix已按自然数初始化:
int matrix[6][10]; int *mp; ...
mp = &matrix[3][8];
printf(\"First value is %d\\n\printf(\"Second value is %d\\n\printf(\"Third value is %d\\n\
答:
13) 多维数组名的值实际上是另一个数组,例如:int matrix[3][10]; matrix这个名
字的值是一个指向它第1个元素的指针,所以matrix是一个指向一个包含了3个整型元素的数组的指针。这个论断有没有问题? 答:
14) 对于int matrix[3][10]; 请分析后面两个表达式 *(matrix + 1) + 5; 和
*(*( matrix + 1) + 5); 的具体含义。 答:
15) 指向整型数组的指针的定义: int (*p)[10]; p是一个指向拥有10个整型元素的数
组的指针。我们可以使用这个指针一行一行地在上述matrix中移动,请回答给p每次加1在内存中要移动多少个字节数? 答:
16) 如果需要一个指针逐个访问整型元素而不是逐行在二维数组中移动。下面两个声明都创
建了一个简单的整型指针,并以两种不同的方式进行初始化,指向matrix的第1个整型元素。int *pi = &matrix[0][0]; int *pi1 = matrix[0]; 请问pi 和pi1有区别吗? 答:
17) 作为函数参数的多维数组名的传递方式和一维数组名相同--实际传递的是一个指向数组
第1个元素的指针。谈谈两者在作为函数形参时存在的区别? 答:
18) 把二维数组作为函数形参进行声明时,以下两种方式都是可以的, void
func(int (*mat)[10]); void func(int mat[][10]); 那么将func写成void func2(int **mat); 这样的原型正确吗?请给出你的解释。 答:
19) 在多维数组中,只有第1维才能根据初始化列表缺省地提供。剩余的几个维必须显式地
写出,这样编译器就能推断出每个子数组维数的长度。对于这个论述,请解释原因何在。 答:
20) 对于指针数组声明:int *api[10]; 下标引用和间接访问的优先级哪个更高,在这个
表达式中,首先执行的是下标引用还是间接访问? 答:
21) 对于二维数组的两种定义方式:
char const *keyword[] = { };
char const keyword1[][9] = {
\"do\\"for\\"if\\"register\\"do\\"for\\"if\\"register\\"return\\"switch\\"while\"
};
\"return\\"switch\\"while\"
请编写代码比较keyword 和 keyword1 在内存中所占空间的大小。 答:
22) 指针表达式可能比下标表达式效率更高,但下标表达式决不可能比指针表达式效率更高。
谈谈你对这句话的理解。 答:
1.1.8 字符串、字符和字节 (ch8)
1) 字符串就是一串零个或多个字节,并且以一个位模式为全0的NUL字节结尾。因此,字
符串所包含的字符内部不能出现NUL字节。NUL字节是字符串的终止符,请问NUL本身是不是字符串的一部分?字符串的长度是否包括NUL字节? 答:
2) 以下代码段存在什么问题,请予以更正:
char message[] = \"original message\"; char message1[] = \"oh, oh\"; ...
strcpy(message, \"A different message\"); printf(\"%s\\n%s\\n\
答:
3) 请谈谈strcpy(), memcpy() 的区别。
答:
1.1.9 动态内存分配 (ch10)
1) void *malloc(size_t size);
malloc的参数就是需要分配的内存字节数。如果内存池中的可用内存可以满足这个需求,malloc就返回一个指向被分配的内存块的起始位置的指针。请问malloc所分配的
的内存空间一定是连续的吗?这个空间是在栈还是堆上分配的? 答:
2) 谈谈对从malloc返回的指针进行有效性检查的必要性。
答:
3) free的参数必须要么是NULL, 要么是一个先前从malloc, calloc 和realloc返
回的值。向free传递一个NULL参数会产生不良的效果吗? 答:
4) malloc和calloc之间的主要区别是什么?
答:
5) 什么情况下会引起内存泄漏(memory leak)?
答:
1.1.10 结构和联合 (ch9)
1) 聚合数据类型(aggregate data type)能够同时存储超过一个的单独数据。C提供了
两种类型的聚合数据类型,数组和结构。请谈一下数组和结构的区别? 答:
2) 关于结构的自引用:
struct SELF_REF1 {
int a;
struct SELF_REF1 b; int c; };
以上这种类型的自引用是非法的,请说明原因,并给出正确的声明方式。 答:
3) 自引用的声明方式:
typedef struct {
int a;
SELF_REF3 *b; int c; }SELF_REF3;
typedef struct SELF_REF3_TAG {
int a;
struct SELF_REF3_TAG *b; int c; }SELF_REF3;
以上两个自引用的声明方式那个正确? 答:
4) 《标准C语言教程》中9.2 结构、指针和成员 作为重点要求深入理解。谈谈你对结构
和指针重要性的认识。 答:
5) 结构的存储分配和边界对齐:系统禁止编译器在一个结构的起始位置跳过几个字节来满
足边界对齐要求,因此所有的结构的起始存储位置必须是结构中边界要求最严格的数据类型所要求的位置。根据以上原则,求结构体ALIGN和ALIGN1的大小:
struct ALIGN {
char a; int b; char c; };
struct ALIGN1 {
int b; char a; char c; };
答:
6) offsetof(type, member)的用法:type就是结构的类型,member就是需要的那个
成员名。表达式的结果是一个size_t值,表示这个指定成员开始存储的位置距离结构开始存储的位置偏移几个字节。例如,对前面ALIGN声明而言,offset(struct ALIGN, b); 的返回值是4. 请在编译器上进行体验。 答:
7) 位段(bit field)的声明和结构类似,但它的成员是一个或多个位的字段。位段成员必
须声明为int、signed int或unsigned int 类型。下面是一个位段声明的例子,
请画出变量ch1在内存的具体存储形式:
struct CHAR {
unsigned ch : 7; unsigned font : 6; unsigned size : 19; };
struct CHAR ch1;
答:
8) 根据边界对齐要求降序排列结构成员可以最大限度地减少结构存储中浪费的内存空间。
sizeof返回的值包含了结构中浪费的内存空间吗? 答:
9) 联合的所有成员引用的是内存中的相同位置。当需要在不同的时刻把不同的东西存储于
同一个位置时,就可以使用联合。举例说明用途。 答:
10) 联合变量可以被初始化,但这个初始值必须是联合第1个成员的类型,而且它必须位于
一对花括号里面。例如,
union {
int a; float b; char c[4]; }x = {5};
把x.a初始化为5. 请在编译器进行验证。 答:
1.1.11 使用结构和指针 (ch11)
1) 链表(linked list)就是一些包含数据的独立数据结构(通常称为节点)的集合。链
表中的每个节点通过链或指针连接在一起。程序通过指针访问链表中的节点。请说说你所知道的使用链表的地方? 答:
2) 在单链表中,每个节点包含一个指向链表下一节点的指针。链表最后一个节点的指针字
段的值为NULL, 提示链表后面不再有其它节点。在找到链表的第1个节点后,使用指针就可以访问剩余的所有节点。为了标记链表的起始位置,可以使用一个根指针(root pointer), 根指针指向链表的第1个节点。那么一般情况下根节点包含有效数据吗? 答:
3) 链表中的节点可能分布于内存中的各个地方。对于一个处理链表的程序而言,各节点在
物理上是否相邻并没有什么区别,因为程序始终用链(指针)从一个节点移动到另一个节点。如果要对链表进行随机性的访问,那么你觉得它的效率如何? 答:
4) 在一个双向链表中,每个节点都包含两个指针--指向前一个节点的指针和指向后一个节
点的指针。这可以使得我们能以任何方向遍历双链表,甚至可以忽前忽后地在双链表中访问。这在一些特殊的场合非常有实际的使用价值,请举出一个你所知道的使用双向链表的例子,体会这种数据结构的特点。 答:
5) 对于单链表和双链表的建立、插入和删除操作,结合《标准C语言教程》和本章1.2节
练习题目内容,要求务必熟练掌握。 答:
1.1.12 高级指针话题 (ch12)
1) 谈谈你对指向指针的指针的具体含义的理解。
答:
2) 请解释以下各指针声明的含义:int *f(); int (*f)(); int *(*f)();
答:
3) 谈谈你对这些指针的声明的理解:int f[]; int *f[]; int (*f[])(); int
*(*f[])(); 答:
4) 对函数指针初始化,表达式int (*pf)(int) = &f; 中的 & 操作符可以省略吗?
答:
5) 重点理解《标准C语言教程》 回调函数 一节,说说函数指针最常见的使用场合。
答:
6) 当一个字符串常量出现于表达式中时,它的值是个指针常量。你对这个表述如何理解?
答:
7) 对于字符串常量表达式:\"xyz\" + 1; 它的结果是什么?给出你的解释。
答:
8) *\"xyz\"; 这个间接访问的结果是什么?
答:
9) \"xyz\"[2]; 表达式的值是什么?
答:
10) *(\"xyz\" + 4); 表达式合法吗?说说理由。
答:
11) 对于表达式:putchar(\"0123456789ABCEF\"[value % 16]); 请给出你的理解。
答:
1.1.13 位操作 (ch13)
1) 4个位运算符:~, &, |, ^, 都用于整型数据,包括char类型,那么对浮点类型合
适吗? 答:
2) 二进制反码或按位取反:~, 假设val是一个unsigned char, 已赋值为2, 在二进
制中,2是00000010. 于是~val的值为11111101, 或253. 该运算符会改变val的值吗?如果要改变val的值,应当怎么做? 答:
3) 请给出以下操作的结果:
a) b) c) 答:
位与(AND): (10010011) & (00111101); 位或(OR): (10010011) | (00111101); 位异或: (10010011) ^ (00111101);
4) 掩码是某些位设为开(1)而某些位设置为关(0)的位组合。“位与”运算符通常跟掩码一
起使用。例如:ch &= 0xff; 该掩码留下ch的最后8位,将其余设为0. 无论最初的ch是8位、16位或是更多,都将最终的值修整到一个字节中。在这个例子中,掩码宽度为几位? 答:
5) 关闭一些位而不影响其它位的,同时能够将特定的位关闭与能够将特定的位打开一样有
用。那么要关闭指定的位应当使用什么操作,给出示例。 答:
6) 转置(toggling)一个位表示如果该位是打开状态,则关闭该位,如果该位是关闭状态,
则打开该位。可以使用什么运算符来转置一个位?给出示例。 答:
7) 查看一位的值:必须屏蔽flag中的其它位,以便只把flag中的位1和MASK相比较,
试着给出查看位1的示例代码。 答:
8) 位操作中,为了避免信息越界,位掩码至少应该与其所屏蔽的值具有相同的宽度。你对
这个论述如何理解? 答:
9) 左移运算符 << 将其左侧操作数的值的每位向左移动,移动的位数由其右侧操作数指定。
那么因左移而空出的位用什么填充? 答:
10) 右移位运算符 >> 将其左侧操作数的值的每位向右移动,移动的位数由其右侧操作数指
定。丢弃移出左侧操作数右端的位。对于unsigned类型,使用0填充左端空出的位。对于有符号类型,结果依赖于机器,空出的位可能用0填充,或者使用符号(最左端的)位的副本填充。请检验你所使用的机器填充的是0还是1 ? 答:
11) 对于位字段(bit field), 如果所声明位段总位数超过一个unsigned int大小,那
么将会发生什么?该位段会使用下一个unsigned int的存储位置。C不允许一个字段跨越两个unsigned int之间的边界。编译器会自动地移位这样的字段定义,使该字段按unsigned int边界对齐。请在机器上进行验证。 答:
1.1.14 文件操作 (ch14)
1) C将文件看成是连续的字节序列,其中每一个字节都可以单独地读取。ANSI C提供了文
件的两种格式:文本格式和二进制格式。请分别描述这两种格式的特点。 答:
2) C程序运行时会自动打开3个文件。这3个文件被称为标准输入(standard input), 标
准输出(standard output)和标准错误输出(standard error output). 默认的标准输入是系统的一般输入设备,通常为键盘;默认的标准输出和标准错误输出是系统的一般输出设备,通常为显示器。结合该段论述,请从广义的角度理解文件的概念并谈谈你的认识。 答:
3) 请说明return和exit()的区别。
答:
4) fopen()打开文件时,\"r\\"w\\"a\\"w+\\"a+\\"rb\\"wb\\"ab\\"ab+\
\"a+b\的具体含义分别是什么? 答:
5) fopen()函数返回一个文件指针(file pointer), 文件指针是一种指向FILE结构的
指针,FILE是stdio.h中定义的一种派生类型。指针fp并不指向实际的文件,而是指向一个有关该文件信息的数据块,其中包括文件I/O使用的缓冲区信息。借助MSDN, 请对FILE结构体做一个说明。 答:
6) 从文件中读取数据的程序需要在到达文件结尾时停止。程序怎么才能知道是否已到达文
件结尾了呢? 答:
7) flose(fp)函数关闭由fp指定的文件,同时根据需要刷新缓冲区。更正规的程序也许
还要检查是否成功关闭了文件。如果文件成功关闭,fclose()函数将返回值0, 否则返回EOF. 请查看MSDN相关文档,并结合第2章的练习,理解关闭文件的重要性。 答:
8) 给出fprintf(), fscanf(), fgets(), fputs()等常用文件I/O函数的使用场合。
答:
9) 给出fseek()和ftell()函数的功能和用途的说明。
答:
10) 结合《标准C语言教程》相关章节内容,深入理解二进制I/O:fread()和fwrite()
函数的功能和用法。 答:
1.1.15 标准函数库 (ch15)
1) 通读《标准C语言教程》第15章节,了解C运行库所提供的各类常用例程的功能和用
法,并做一个简略的总结。 答:
1.1.16 预处理 (ch16)
1) 编译一个C程序涉及很多步骤,其中第1个步骤被称为预处理(preprocessing)阶段。
C预处理器(preprocessor)在源代码编译之前对其进行一些文本性质的操作,它的主要任务包括删除注释、插入被#include指令包含的文件的内容、定义和替换由#define指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。请结合教程和编码实践谈谈你对这段话的理解。 答:
2) #define机制包括了一个规定,允许把参数替换到文本中,这种实现方法通常称为宏
(macro)或定义宏(defined macro)。现在有宏定义:#define SQUARE(x) x * x 请给出a = 5; printf(\"%d\\n\的输出。 答:
3) #include指令使另外一个文件的内容被编译,就像它实际出现于#include指令出现
的位置一样。这种替换执行的方式很简单:预处理器删除这条指令,并用包含文件的内容取而代之。这样,一个头文件如果被包含到10个源文件中,它实际上被编译了10次。
但如果一个头文件被同一个源文件多次包含,会发生什么情况。 答:
8-1 回答下列问题 , 并在相应图上分别标出内、外螺纹的尺寸 .
(1) a 内、外螺纹旋合时 , 需要 、 、 、 、 等五要素相同 .
b 不论内螺纹或是外螺纹 , 螺纹的代号及尺寸均应注在螺纹的 径上 ; 但管螺纹用 标注 . c 标准螺纹的 、 、 都要符合国家标准。常用的标准螺纹有 。[答案] (2)
M16-6g 表示 螺纹 . M16-5H 表示 螺纹 . [答案] (3) [答案]
M16 ╳ 1.5 —— 5g6g 表示 螺纹。 M16 ╳ 1.5 —— 6H 表示 螺纹。 ( 4 ) [答案]
Tr32 ╳ 12(P6)LH表示 为32毫米, 为12毫米, 线 旋螺纹。 ( 5) [答案]
B120 ╳ 18(P6)表示 为120毫米, 为6毫米, 线、 旋 螺纹。 ( 6 ) [答案]
特 M16 ╳ 1.55是 螺纹,其 、 符合国家标准规定,但 不符合国标规定. (7) [答案]
G1 ″ 表示管子的 是 1 ″ , 查表知其螺纹大径为 ,螺距是 , 每英寸 牙 . (8) [答案]
非标准螺纹的 不符合国标规定 , 画图时应画出 , 并注出螺纹的 .
8-2 圈出下列各题 (1)-(4) 中的错误 , 在空白处画出正确的图形 , 在指定位置画出 (5) 的指定剖面 . (1) [答案]
(2) [答案]
(3) [答案]
(4) [答案]
(5) [答案]
8-3 根据螺纹连接件的代号 , 查表并标出全部尺寸 . [答案]
8-4 找出左边双头螺柱连接装配图中的错误 , 在右边画出正确的连接图 .( 主视图画成全剖视图 ). [答案]
8-5 画出两板的螺栓连接图 . [答案]
已知两板厚 d1=d2=20mm, 板长 24mm, 宽 50mm. 螺栓 GB5782-86-M20 ╳ L(L 计算后取标准值 ). 螺母 GB6170-86-M20. 垫圈 GB97.1-85-20.
要求 : 按比例 1:1 画出螺栓装配图的三视图 ( 主视图作全剖视 ). 8-6 画出零件的螺钉连接图 . [答案]
已知 : 上板厚 d1=8mm, 下板厚 d2=32mm, 材料为铸铁 .
螺钉 GB68-85- M10 ╳ L(L 计算后取标准值 ).
要求 : 按比例 2:1 画出螺钉装配图的二个视图 ( 主视图作全剖视 ). 8-7 按给定尺寸和规定画法画螺纹 [答案] • 外螺纹( M24 ),螺纹长度为 30mm 。
• 螺纹通孔( M20 ),两端孔的倒角 C1 [答案]
• 螺纹不通孔( M16 ),钻孔深度 30mm ,螺纹深度 24mm ,孔口倒角 C1 [答案]
• 将下列图形按螺纹连接的规定画法画出。 [答案]
8-8 解释下列螺纹标记的意义 [答案] • M24LH-5H-S • M20X1.5-5g6g • Tr32X6LH-7H • B40X14(P7)-8e-L 8-9 标注螺纹代号 [答案]
• 普通粗牙外螺纹,公称直径 24mm ,单线,右旋,中径、顶径公差带代号 6g ,中等旋合长度。
• 普通螺纹,公称直径 24mm ,螺距 2mm ,单线,左旋,中径、顶径公差带代号分别为 5H 、 6H ,中等旋合长度。 [答案]
• 锯齿形螺纹,公称直径 32mm ,螺距 6mm ,双线,右旋,中径公差带代号 7h ,中等旋合长度。 [答案]
• 用螺纹密封的圆锥内螺纹尺寸代号 1 ,右旋。 [答案]
• 非螺纹密封的管螺纹尺寸代号 1 ,公差等级 A 级,右旋。 [答案]
• 用螺纹密封的圆锥外螺纹尺寸代号 1 ,左旋。 [答案]
8-10 补全齿轮啮合的主视图和左视图。 [答案]
8-11 键联结。已知齿轮和轴用 A 型普通平键联结,轴、孔直径为 20mm ,键长为 20mm 。要求写出键的规定标记,查表确定键槽的尺寸,画全下列各视图和断面图中所缺漏的图线,并在轴的断面图和齿轮的局部视图中标注轴、孔直径和键槽的尺寸。 [答案]
8-12 销联结、弹簧和轴承画法。
• 齿轮与轴用直径为 10mm 的圆柱销连接,画全销连接的剖视图,比例 1 : 1 ,并写出圆柱销的规定标记。 [答案]
• 用规定画法在轴端画出轴承与轴的装配图,并解释滚动轴承代号的含义。 [答案] 滚动轴承 6205
含义: 内 径 尺寸系列 轴承类型
8-1(1)d
(1) a 内、外螺纹旋合时 , 需要 牙型 、 大径 、 螺距 、 线数 、五要素相同 .
旋向 等 b 不论内螺纹或是外螺纹 , 螺纹的代号及尺寸均应注在螺纹的 大 径上 ; 但管螺纹用 指引线引出 标注 .
c 标准螺纹的 牙型 、 大径 、 螺距 都要符合国家标准。常用的标准螺纹有 普通螺纹、管螺纹、梯形螺纹、锯齿形螺纹。 8-1(2)d
M16-6g 表示 大径为 16 , 中径和顶径公差带均为 6g 的粗牙普通外 螺纹 . M16-5H 表示 大径为 16 , 中径和顶径公差带均为 5H 的粗牙普通内 螺纹 . 8-1(3)d
M16 ╳ 1.5 —— 5g6g 表示 大径为 16 , 螺距 1.5, 中径、顶径公差带分别为 5g 、 6g 的细牙普通外 螺纹。
M16 ╳ 1.5 —— 6H 表示 大径为 16 , 螺距 1.5, 中径、顶径公差带均为 6H 的细牙普通内 螺纹。 8-1 ( 4 ) d
Tr32 ╳ 12(P6)LH表示 大径 为32毫米, 导程 为12毫米, 双 线 右 旋螺纹。
8-1(5)d
B120 ╳ 18(P6)表示 大径 为120毫米, 螺距 为6毫米, 3 线、 左 旋锯齿形 螺纹。 8-1(6)d
特 M16 ╳ 1.55是 特殊 螺纹,其 牙型 、 大径 符合国家标准规定,但 螺距 不符合国标规定. 8-1(7)d
G1 ″ 表示管子的 公称直径 是 1 ″ , 查表知其螺纹大径为 33.249 , 螺距是 2.309 , 每英寸 11 牙 . 8-1(8)d
非标准螺纹的 牙型 不符合国标规定 , 画图时应画出 牙型 , 并注出螺纹的 全部尺寸 . 8-2(1)d
8-2(2)d
8-2(3)d
8-2(4)d
8-2(5)d
8-3d
8-4d
8-5d
8-6d
8-7 按给定尺寸和规定画法画螺纹 (1)d
(2)d
(3)d
(4)d
8-8d
(1)M24LH-5H-S 公称直径为 24 ,左旋,中径和顶径的公差带代号为 5H 短旋合长度的普通 cu 粗牙内螺纹
(2)M20X1.5-5g6g 公称直径为 20 ,螺距为 1.5 ,中径和顶径的公差带代号分别为 5g 和 6g 的普通细牙内螺纹
(3)Tr32X6LH-7H 公称直径为 32 ,导程为 6 ,左旋,中径公差带代号为 7H 的梯形单线内螺纹
(4)B40X14(P7)-8e-L 公称直径为 40 ,导程 14 ,螺距 7 ,中径的公差带代号为 8e ,长旋合长度的锯齿形双线外螺纹 8-9 标注螺纹代号 (1)d
(2)d
(3)d
(4)d
(5)d
(6)d
8-10d
8-11d
8-12(1)d
8-12(2)d
因篇幅问题不能全部显示,请点此查看更多更全内容