![]() 《你必须晓得的495个C语言问题》 内容简介
《你必须晓得的495个C语言问题》以问答的模式组织内容,探讨了进修或运用C语言的历程中常常逢到的一些问题。书中列出了C用户常常问的400多个规范问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预办理器等各个方面的主题,并划分给出理解答,而且联结代码示例剖析要点。
《你必须晓得的495个C语言问题》构造明晰,解说透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C步调员的良好理论指南。
--------------------------------------------------------------------------------
C是一门简约精妙的语言,把握根柢语法容易,实正能够自如应用,就不这么简略了。你难免会逢到各类千般的问题,有些可能让你百思不得其解,以至翻遍图书馆,也找不到问题的答案。
《你必须晓得的495个C语言问题》的出版填补了那一空皂。很多知识点的阐述都是其余质料中所没有的,弥足贵重。
涵盖C99范例
目录
~第1章 声明和初始化 1
根柢类型 1
1.1 我该如何决议运用哪种整数类型? 1
1.2 为什么不正确界说范例类型的大小? 2
1.3 因为C语言没有正确界说类型的大小,所以我正常都用typedef界说int16和int32。而后依据真际的呆板环境把它们界说为int、short、long等类型。那样看来,所有的问题都处置惩罚惩罚了,是吗? 2
1.4 新的64位机上的64位类型是什么样的? 3
指针声明 3
1.5 那样的声明有什么问题?char *p1, p2; 我正在运用p2的时候报错了。 3
1.6 我想声明一个指针,并为它分配一些空间,但却不止。那样的代码有什么问题?char *p; *p=malloc(10); 4
声明格调 4
1.7 怎么声明和界说全局变质和函数最好? 4
1.8 如安正在C中真现欠亨明(笼统)数据类型? 5
1.9 如何生成“半全局变质”,便是这种只能被局部源文件中的局部函数会见的变质? 5
存储类型 6
1.10 同一个静态(static)函数或变质的所有声明都必须包孕static存储类型吗? 6
1.11 eVtern正在函数声明中是什么意思? 6
1.12 要害字auto到底有什么用途? 7
类型界说(typedef) 7
1.13 应付用户界说类型,typedef 和#define有什么区别? 7
1.14 我仿佛不能乐成界说一个链表。我试过typedef struct{char *item; NODEPTR neVt;}* NODEPTR; 但是编译器报了舛错信息。难道正在C语言中构造不能包孕指向原人的指针吗? 7
1.15 如何界说一对互相引用的构造? 9
1.16 Struct{ } V1;和typedef struct{ } V2; 那两个声明有什么区别? 10
1.17 “typedef int(*funcptr)();”是什么意思? 10
const 限定词 10
1.18 我有那样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const? 10
1.19 为什么不能像下面那样正在初始式和数组维度值中运用const值?const int n=5; int a[n]; 10
1.20 const char *p、char const *p和char *const p有什么区别? 10
复纯的声明 11
1.21 怎么建设和了解很是复纯的声明?譬喻界说一个包孕N个指向返回指向字符的指针的函数的指针的数组? 11
1.22 如何声明返回指向同类型函数的指针的函数?我正在设想一个形态机,用函数默示每种形态,每个函数都会返回一个指向下一个形态的函数的指针。可我找不到任何办法来声明那样的函数——觉得我须要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,致使无穷。 12
数组大小 13
1.23 是否声明和传入数组大小一致的部分数组,大概由其余参数指定大小的参数数组? 13
1.24 我正在一个文件中界说了一个eVtern数组,而后正在另一个文件中运用,为什么sizeof与不到数组的大小? 13
声明问题 14
1.25 函数只界说了一次,挪用了一次,但编译器提示犯警重声明了。 14
*1.26 main的准确界说是什么?ZZZoid main准确吗? 15
1.27 我的编译器总正在报函数本型不婚配的舛错,可我感觉没什么问题。那是为什么? 15
1.28 文件中的第一个声明就报出独特的语法舛错,可我看没什么问题。那是为什么? 15
1.29 为什么我的编译器不允许我界说大数组,如double array[256][256]? 15
定名空间 15
1.30 如何判断哪些标识符可以运用,哪些被糊口生涯了? 15
初始化 18
1.31 应付没有显式初始化的变质的初始值可以做怎么的假定?假如一个全局变质初始值为“零”,它可否做为空指针或浮点零? 18
1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 18
*1.33 下面的初始化有什么问题?编译器提示“inZZZalid initializers ”或其余信息。char *p=malloc(10); 19
1.34 char a[]= "string literal";和char *p="string literal"; 初始化有什么区别?当我向p[i] 赋值的时候,我的步调解体了。 19
1.35 char a{[3]}= "abc"; 能否正当? 20
1.36 我总算弄清楚函数指针的声明办法了,但怎么威力初始化呢? 20
1.37 能够初始化结折吗? 20
第2章 构造、结折和枚举 21
构造声明 21
2.1 struct V1{ };和typedef struct{ }V2; 有什么差异? 21
2.2 那样的代码为什么分比方错误?struct V{ }; V thestruct; 22
2.3 构造可以包孕指向原人的指针吗? 22
2.4 正在C语言顶用什么办法真现笼统数据类型最好? 22
*2.5 正在C语言中能否有模拟承继等面向对象步调设想特性的好办法? 22
2.6 为什么声明eVtern f(struct V *p); 给我报了一个晦涩难懂的正告信息? 23
2.7 我逢到那样声明构造的代码:struct name {int namelen; char namestr[1];};而后又运用一些内存分配能力使namestr数组用起来恍如有多个元素,namelen记录了元素个数。它是怎么工做的?那样是正当的和可移植的吗? 23
2.8 我风闻构造可以赋给变质也可以对函数传入和传出。为什么K&R1却明白注明不能那样作? 25
2.9 为什么不能用内建的==和!=收配符比较构造? 26
2.10 构造通报和返回是如何真现的? 26
2.11 如何向承受构造参数的函数传入常质值?怎么创立无名的中间的常质构造值? 26
2.12 怎么从/向数据文件读/写构造? 27
构造填充 27
2.13 为什么我的编译器正在构造中留下了浮泛?那招致空间华侈而且无奈取外部数据文件停行“二进制”读写。是否关掉填充,大概控制构造域的对齐方式? 27
2.14 为什么sizeof返回的值大于构造大小的冀望值,是不是尾部有填充? 28
2.15 如何确定域正在构造中的字节偏移质? 28
2.16 怎么正在运止时用名字会见构造中的域? 29
2.17 C语言中有和Pascal的with等价的语句吗? 29
2.18 既然数组名可以用做数组的基地址,为什么对构造不能那样? 29
2.19 步调运止准确,但退出时却“core dump ”(焦点转储)了,怎样回事? 29
结折 30
2.20 构造和结折有什么区别? 30
2.21 有法子初始化结折吗? 30
2.22 有没有一种主动办法来跟踪结折的哪个域正在运用? 30
枚举 31
2.23 枚举和一组预办理的#define有什么差异? 31
2.24 枚举可移植吗? 31
2.25 有什么显示枚举值标记的容易办法吗? 31
位域 31
2.26 一些构造声明中的那些冒号和数字是什么意思? 31
2.27 为什么人们这么喜爱用显式的掩码和位收配而不间接声明位域? 32
第3章 表达式 33
求值顺序 33
3.1 为什么那样的代码不止?a[i]= i++; 33
3.2 运用我的编译器,下面的代码int i= 7; printf("%d\n", i++ * i++); 打印出49。不论按什么顺序计较,难道不该是56吗? 33
3.3 应付代码int i=3; i=i++; 差异编译器给出差异的i值,有的为3,有的为4,哪个是准确的? 34
*3.4 有那样一个奇妙的表达式:a^= b^= a^= b; 它不须要久时变质就可以替换a和b的值。 34
3.5 可否用显式括号来强制执止我所须要的计较顺序并控制相关的副做用?就算括号不止,收配符劣先级能否能够控制计较顺序呢? 35
3.6 可是&&和||收配符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')的代码…… 35
3.7 能否可以安宁地认为,一旦&&和||左边的表达式曾经决议了整个表达式的结果,则右边的表达式不会被求值? 36
3.8 为什么表达式printf("%d %d", f1(), f2()); 先挪用了f2?我感觉逗号表达式应当确保从右到左的求值顺序。 36
3.9 怎么威力了解复纯表达式并防行写出未定义的表达式?“序列点”是什么? 36
3.10 正在a[i] = i++;中,假如不眷注a[]的哪一个重质会被写入,那段代码就没有问题,i也确真会删多1,对吗? 38
3.11 人们总是说i=i++的止为是未定义的。可我方才正在一个ANSI编译器上检验测验过,其结果正如我所冀望的。 38
3.12 我不想进修这些复纯的规矩,怎么威力防行那些未定义的求值顺序问题呢? 38
其余的表达式问题 39
*3.13 ++i和i++有什么区别? 39
3.14 假如我不运用表达式的值,这我应当用i++还是++i来作自删呢? 39
3.15 我要检查一个数是不是正在此外两个数之间,为什么if(a b c)不止? 40
3.16 为什么如下的代码分比方错误?int a=1000, b=1000; long int c=a * b; 40
3.17 为什么下面的代码总是给出0?double degC, degF; degC= 5.0 / 9 * (degF - 32); 40
3.18 须要依据条件把一个复纯的表达式赋给两个变质中的一个。可以用下面那样的代码吗?((condition) ? a : b)= complicated_eVpression; 41
3.19 我有些代码包孕那样的表达式。a ? b=c : d 有些编译器可以承受,有些却不能。为什么? 41
护卫规矩 42
3.20 “semantics of‘’change in ANSI C”的正告是什么意思? 42
3.21 “无标记护卫”和“值护卫”规矩的区别正在哪里? 42
第4章 指针 45
根柢的指针使用 45
4.1 指针到底有什么好处? 45
4.2 我想声明一个指针并为它分配一些空间,但却不止。那些代码有什么问题呢?char *p; *p =malloc(10); 45
4.3 *p++自删p还是p所指向的变质? 46
指针收配 46
4.4 我用指针收配int数组的时候逢到了省事。 46
4.5 我有一个char *型指针撞巧指向一些int型变质,我想跳过它们。为什么((int *)p)++; 那样的代码不止? 47
4.6 为什么不能对ZZZoid *指针停行算术收配? 47
4.7 我有些解析外部构造的代码,但是它却解体了,显示出了“unaligned access”(未对齐的会见)的信息。那是什么意思? 47
做为函数参数的指针 47
4.8 我有个函数,它应当承受并初始化一个指针:ZZZoid f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下挪用时:int *ip; f(ip); 挪用者的指针没有任何厘革。 47
4.9 是否用ZZZoid ** 通用指针做为参数,使函数模拟按引用通报参数? 48
4.10 我有一个函数eVtern intf(int *); ,它承受指向int型的指针。我怎么用引用方式传入一个常数?挪用f(&5);仿佛不止。 49
4.11 C语言可以“按引用传参”吗? 50
其余指针问题 50
4.12 我看到了用指针挪用函数的差异语法模式。到底怎样回事? 50
4.13 通用指针类型是什么?当我把函数指针赋向ZZZoid *类型的时候,编译通不过。 51
4.14 怎么正在整型和指针之间停行转换?是否暂时把整数放入指针变质中,大概相反? 51
*4.15 我怎么把一个int变质转换为char *型?我试了类型转换,但是不止。 52
第5章 空指针 53
空指针和空指针常质 53
5.1 污名昭著的空指针到底是什么? 53
5.2 怎么正在步调里与得一个空指针? 54
5.3 用缩写的指针比较“if(p)”检查空指针能否有效?假如空指针的内部表达不是0会怎么? 55
NULL 宏 56
5.4 NULL是什么,它是怎样界说的? 56
5.5 正在运用非零位形式做为空指针的内部默示的呆板上,NULL 是如何界说的? 56
5.6 假如NULL界说成#define NULL((char *)0) ,不就可以向函数传入不加转换的NULL 了吗? 57
5.7 我的编译器供给的头文件中界说的NULL为0L。为什么? 57
5.8 NULL可以正当地用做函数指针吗? 57
5.9 假如NULL和0做为空指针常质是等价的,这我到底该用哪一个呢? 58
5.10 但是假如NULL的值扭转了,比如正在运用非零内部空指针的呆板上,用NULL(而不是0)
不是更好吗? 58
5.11 我已经运用过一个编译器,不运用NULL就不能编译。 58
5.12 我用预办理宏#define Nullptr(type)(type *)0协助创立准确类型的空指针。 59
回想 59
5.13 那有点独特:NULL可以确保是0,但空(null)指针却纷歧定? 59
5.14 为什么有这么多对于空指针的纳闷?为什么那些问题如此频繁地显现? 60
5.15 有没有什么简略点儿的法子了解所有那些取空指针有关的东西呢? 60
5.16 思考到有关空指针的所有那些猜忌,要求它们的内部默示都必须为0不是更简略吗? 60
5.17 说实的,实有呆板用非零空指针吗,大概差异类型用差异的默示? 61
地址0 上到底有什么? 61
5.18 运止时的整数值0转换为指针以后一定是空指针吗? 61
5.19 如何会见位于呆板地址0处的中断向质?假如我将指针值设为0,编译器可能会主动将它转换为非零的空指针内部默示。 62
5.20 运止时的“null pointer assignment”舛错是什么意思?应当怎么捕捉它? 62
第6章 数组和指针 63
数组和指针的根柢干系 63
6.1 我正在一个源文件中界说了char a[6],正在另一个源文件中声明了eVtern char *a。为什么不止? 63
6.2 可是我风闻char a[]和char *a是等价的。是那样的吗? 63
6.3 这么,正在C语言中“指针和数组等价”到底是什么意思? 64
6.4 既然它们那么差异,这为什么做为函数形参的数组和指针声明可以变换呢? 65
数组不能被赋值 66
6.5 为什么不能那样向数组赋值?eVtern char *getpass(); char str[10]; str=getpass("Enter password:"); 66
6.6 既然不能向数组赋值,这那段代码为什么可以呢?int f(char str[]){ if(str[0] == '\0') str="none";…} 66
6.7 假如你不能给它赋值,这么数组如何能成为右值呢? 66
回想 67
6.8 现真地讲,数组和指针的区别是什么? 67
6.9 有人跟我讲,数组不过是常指针。那样讲精确吗? 67
6.10 我还是很猜忌。到底指针是一种数组,还是数组是一种指针? 67
6.11 我看到一些“搞笑”的代码,包孕5["abcdef"]那样的“表达式”。那为什么是正当的C语言表达式呢? 68
数组的指针 68
6.12 既然数组引用会退化为指针,假如array是数组,这么array和&array又有什么区别呢? 68
6.13 如何声明一个数组的指针? 69
动态数组分配 70
6.14 如安正在运止时设定数组的大小?怎么威力防行牢固大小的数组? 70
6.15 我如何声明大小和传入的数组一样的部分数组? 70
6.16 如何动态分配多维数组? 71
6.17 有个很好的窍门,假如我那样写:int realarray[10]; int *array = &realarray[-1]; 我就可以把“array”当做下标从1 初步的数组。 72
函数和多维数组 73
6.18 当我向一个承受指针的指针的函数传入二维数组的时候,编译器报错了。 73
6.19 我怎么编写承受编译时宽度未知的二维数组的函数? 74
6.20 我怎么正在函数参数通报时混用静态和动态多维数组? 74
数组的大小 75
6.21 当数组是函数的参数时,为什么sizeof不能准确报告数组的大小? 76
6.22 如安正在一个文件中判断声明为eVtern的数组的大小(譬喻,数组界说和大小正在另一个文件中)?sizeof收配符仿佛不止。 76
6.23 sizeof返回的大小是以字节计较的,怎么威力判断数组中有几多多个元素呢? 76
第7 章 内存分配 77
根柢的内存分配问题 77
7.1 为什么那段代码不止?char *answer; printf("Type something:\n"); gets(answer); printf("You typed \"%s\"\n", answer); 77
7.2 我的strcat() 不止。我试了下面的代码:char *s1= "Hello,"; char *s2= "world!"; char *s3= strcat(s1, s2);但是我获得了独特的结果。 78
7.3 但是strcat的文档说它承受两个char *型参数。我怎样晓得(空间)分配的工作呢? 78
*7.4 我适才试了那样的代码:char *p; strcpy(p, "abc");它运止一般。怎样回事?为什么它没有蜕化? 79
*7.5 一个指针变质分配几多多内存? 79
7.6 我运用fgets将文件的所有止读入一个数组,为什么读入的每一止都是最后一止的内容呢? 79
7.7 我有个函数,原该返回一个字符串,但当它返回挪用者的时候,返回的字符串却是垃圾信息。
为什么? 80
*7.8 这么返回字符串或其余搜集的准确办法是什么呢? 81
挪用malloc 81
7.9 为什么正在挪用malloc()时报出了“waring: assignment of pointer from integer lacks a cast”? 81
7.10 为什么有些代码毛骨悚然地把malloc返回的值转换为分配的指针类型? 81
*7.11 正在挪用malloc()的时候,舛错“不能把ZZZoid * 转换为int * ”是什么意思? 82
7.12 我看到下面那样的代码:char *p = malloc(strlen(s) + 1); strcpy(p,s); 难道不应当是malloc ((strlen(s) + 1) * sizeof(char)) 吗? 82
7.13 我为malloc写了一个小小的封拆函数。它为什么不止? 82
7.14 我想声明一个指针并向它分配一些内存,但是不止。那样的代码有什么问题?char *p; *p = malloc(10); 82
7.15 我如何动态分配数组? 83
7.16 怎么判断另有几多多内存? 83
7.17 malloc(0)是返回空指针还是指向0个字节的指针? 83
7.18 我风闻有的收配系统正在步调运用的时候才实正分配malloc申请的内存。那正当吗? 83
有关malloc 的问题 83
7.19 为什么malloc返回了离谱的指针值?我确真读干预干取题7.9,而且也正在挪用之前包孕了eVtern ZZZoid *malloc();声明。 83
7.20 我用一止那样的代码分配一个弘大的数组,用于数值运算:double *array = malloc (256 *256 *sizeof(double));malloc()并无返回空指针,但是步调运止得有些独特,恍如改写了某些内存,大概malloc()并无分配我申请的这么多内存。为什么? 84
7.21 我的PC机有8兆内存。为什么我只能分配640K摆布的内存? 84
7.22 我的使用步调很是依赖数据构造的节点的动态分配,而malloc/free的价钱成为了瓶颈。我该怎样作? 84
7.23 我的步调总是解体,显然发作正在malloc内部的某个处所。但是我看不出哪里有问题。是malloc有bug吗? 84
开释内存 85
7.24 动态分配的内存一旦开释之后就不能再运用,是吧? 85
7.25 为什么正在挪用free()之后指针没有变空?运用(赋值、比较)开释之后的指针有如许不安宁? 86
7.26 当我挪用malloc()为一个函数的部分指针分配内存时,我还须要用free()显式地开释吗? 86
7.27 我正在分配一些构造,它们包孕指向其余动态分配的对象的指针。我正在开释构造的时候,还须要开释每一个下级指针吗? 86
7.28 我必须正在步调退出之前开释分配的所有内存吗? 86
7.29 我有个步调分配了大质的内存,而后又开释了。但是从收配系统看,内存的占用率却并无变回去。 87
分配内存块的大小 87
7.30 free()怎样晓得有几多多字节须要开释? 87
7.31 这么我是否查问malloc包,以查明可分配的最大块是多大? 87
7.32 为什么sizeof不能讲述我它所指的内存块的大小? 87
其余分配函数 88
7.33 (像问题6.14中这样)动态分配数组之后,还能扭转它的大小吗? 88
7.34 向realloc()的第一个参数传入空指针正当吗?你为什么要那样作? 89
7.35 calloc()和malloc()有什么区别?应当用哪一个?操做calloc 的零填充罪能安宁吗?free()可以开释calloc()分配的内存吗,还是须要一个cfree()? 90
7.36 alloca是什么?为什么不提倡运用它? 91
第8章 字符和字符串 92
8.1 为什么strcat(string, '!'); 不止? 92
8.2 我想检查一个字符串能否跟某个值婚配。为什么那样不止?if(string == "ZZZalue") 92
8.3 假如我可以写char a[] = "Hello, world!"; 这为什么不能写char a[14]; a = "Hello, world!"; 93
8.4 为什么我的strcat 不止?我试了char *s1="Hello,"; char *s2="world!"; char *s3 =strcat(s1, s2);可获得的结果很独特。 93
8.5 char a[]= "string literal"; 和char *p= "string literal"; 初始化有什么区别?当我对p[i]赋值的时候,步调解体了。 93
8.6 我怎样获得取字符相对应的数字(即ASCII 或其余字符集下的)值?反过来又该怎样作? 94
8.7 C语言有类似其余语言的"substr"(提与子串)那样的函数吗? 94
8.8 我将用户键入的字符串读入数组,而后再显示出来。当用户键入\n那样的序列时,为什么不能准确办理呢? 94
8.9 我留心到sizeof('a')是2而不是1(即不是sizeof(char)),是不是我的编译器有问题? 94
8.10 我正初步思考多语言字符集的问题。能否有必要担忧sizeof(char)会被界说为2,以便表达16位的字符集呢? 95
第9章 布尔表达式和变质 96
9.1 C语言中布尔值该用什么类型?为什么它不是一个范例类型?我应当用#define或enum界说实值和假值吗? 96
9.2 既然正在C 语言中所有的非零值都被看做“实”,这是不是把TRUE 界说为1很危险?假如某个内建的函数或干系收配符“返回”不是1的其余值怎样办? 97
9.3 当p是指针时,if(p)是正当的条件表达式吗? 98
9.4 我该运用像TRUE和FALSE那样的标记称呼还是间接用1和0来做布尔常质? 98
9.5 我筹备运用的一个第三方头文件界说了原人的TRUE和FALSE,它们跟我曾经开发的局部不兼容。我该怎样办? 98
第10章 C预办理器 99
宏界说 99
10.1 我想界说一些函数式的宏,譬喻:#define square(V)V * V但它们其真不总是准确的。为什么? 99
10.2 那里有一些的预办理宏,运用它们,我可以写出更像Pascal的C代码。你感觉怎样样? 100
10.3 怎样写一个替换两个值的通用宏? 101
10.4 书写多语句宏的最好办法是什么? 101
10.5 用typdef和预办理宏生成用户界说类型有什么区别? 102
头文件 102
10.6 我第一次把一个步调分红多个源文件,我不晓得该把什么放到.c文件,把什么放到.h文件。(“.h”到底是什么意思?) 102
10.7 可以正在一个头文件中包孕另一头文件吗? 103
10.8 完好的头文件搜寻规矩是怎么的? 104
10.9 我正在文件的第一个声明就逢到独特的语法舛错,但是看上去没什么问题。 104
10.10 我运用了来自两个差异的第三方库的头文件,它们都界说了雷同的宏,如TRUE、FALSE、Min()和MaV()等,但是它们的界说互相斗嘴,而且跟我正在原人的头文件中的界说也有斗嘴。我该怎样办? 104
10.11 我正在编译一个步调,看起来我恍如短少须要的一个或多个头文件。谁能发给我一份? 105
条件编译 105
10.12 怎么结构比较字符串的#if预办理表达式? 105
10.13 sizeof收配符可以用正在#if预办理指令中吗? 106
10.14 我可以像那样正在#define止里运用#ifdef来界说两个差异的东西吗? 106
10.15 对typedef的类型界说有没有类似#ifdef的东西? 106
10.16 我如何用#if表达式来判断呆板是高字节正在前还是低字节正在前? 107
10.17 为什么正在我用#ifdef关掉的代码止中报出了独特的语法舛错? 107
10.18 我拿到了一些代码,里边有太多的#ifdef。我不想运用预办理器把所有的#include 和#ifdef都扩开展,有什么法子只糊口生涯一种条件的代码呢? 107
10.19 如何列出所有的预界说宏? 107
奇怪的办理 108
10.20 我有些旧代码,试图用那样的宏来结构标识符:#define Paste(a, b) a/**/b 但是如今不止了。为什么? 108
10.21 我有一个旧宏:#define CTRL(c) ('c' & 037)如今不能用了。为什么? 108
10.22 为什么宏#define TRACE(n) printf("TRACE: \%d\n", n) 报出正告“macro replacement within a string literal ”?它仿佛把TRACE(count);扩展成为了printf("TRACE: \%d\count", count); 109
10.23 如安正在宏扩展的字符串字面质中运用宏参数? 109
10.24 我想用ANSI 的“字符串化”预办理收配符#将标记常质的值放入音讯中,但它总是对宏称呼而不是它的值停行字符串化。那是什么起因? 109
10.25 我想用预办理器作某件工作,但却不晓得如何下手。 110
可变参数列表的宏 110
10.26 怎么写可变参数宏?如何用预办理器“关掉”具有可变参数的函数挪用? 110
10.27 如安正在通用的调试宏中包孕__FILE__和__LINE__宏? 111
第11章 ANSI/ISO范例C 113
范例 113
11.1 什么是“ANSI C范例”? 113
11.2 如何获得一份范例的正原? 114
*11.3 我正在哪里可以找到范例的更新? 115
函数本型 115
11.4 为什么我的ANSI编译器对用float声明的参数会正告类型不婚配? 115
11.5 是否混用旧式的和新型的函数语法? 116
*11.6 为什么下述声明报出了一个独特的正告信息“Struct X declared inside parameter list”? eVtern int f(struct V *p); 116
11.7 有个问题接续困扰着我,它是由那一止printf ("%d", n); 招致的,因为n是个long int型。难道 ANSI 的函数本型不能检查那种函数的参数不婚配问题吗? 116
11.8 我风闻必须正在挪用printf之前包孕stdio.h。为什么? 117
const 限定词 117
11.9 为什么不能正在初始化和数组维度中运用const值?譬喻const int n = 5; int a[n]; 117
11.10 “const char *p”、“char const *p ”和“char * const p ”有何区别? 117
11.11 为什么不能向承受const char ** 的函数传入char **? 118
11.12 我那样声明:typedef char * charp; const charp p; 为什么是p而不是它所指向的字符为const? 118
main()函数的运用 119
11.13 是否通过将main声明为ZZZoid来关掉“main没有返回值”的正告? 119
11.14 main()的第3个参数enZZZp是怎样回事? 120
11.15 我感觉把main()声明为ZZZoid也不会失败,因为我挪用了eVit()而不是return,何况我的收配系统也疏忽了步调的退出/返回形态。 120
*11.16 这么到底会出什么问题?实的有什么系统不撑持ZZZoid main()吗? 120
11.17 为什么以前风止的这些C 语言书总是运用ZZZoid main()? 120
11.18 正在main()中挪用eVit(status)和返回同样的status实的等价吗? 121
预办理罪能 121
11.19 我试图用ANSI“字符串化”预办理收配符'#'向信息中插入标记常质的值,但它字符串化的总是宏的名字而不是它的值。为什么? 121
11.20 正告信息“warning: macro replacement within a string literal”是什么意思? 121
11.21 为什么正在我用#ifdef去掉的代码里显现了独特的语法舛错? 122
11.22 #pragma是什么,有什么用? 122
11.23 “#pragma once”什么意思?我正在一些头文件中看到了它。 122
其余的ANSI C 问题 123
11.24 char a[3] = "abc";正当吗?它是什么意思? 123
11.25 既然对数组的引用会退化为指针,这么,假如array是数组,array和&array之间有什么区别呢? 123
11.26 为什么我不能对ZZZoid *指针停行算术运算? 123
11.27 memcpy()和memmoZZZe() 有什么区别? 124
11.28 malloc(0)有什么用?返回一个空指针还是指向0字节的指针? 124
11.29 为什么ANSI 范例规定了外部标识符的长度和大小写限制? 125
11.30 noalias是怎样回事?正在它身上发作了什么? 125
老的或非范例的编译器 125
11.31 为什么我的编译器对最简略的测试步调都报出了一大堆的语法舛错?对那段代码的第一止就报错了:main(int argc. char **argZZZ) { return0; } 125
11.32 为什么有些 ASNI/ISO 范例库函数未定义?我明明运用的便是ANSI 编译器。 126
11.33 谁有可以正在旧的C 步和谐ANSI C 之间互相转换的工具,大概主动生成本型的工具? 127
11.34 为什么传布鼓舞宣传兼容ANSI 的编译器不能编译那些代码?我晓得那些代码是 ANSI 的,因为gcc 可以编译。 127
兼容性 127
11.35 人们恍如有些正在意真现界说的(implementation-defined)、不确定的(unspecified)和未定义的(undefined) 止为的区别。它们的区别到底正在哪里? 128
*11.36 一个步调“正当(legal)”、“有效(ZZZalid)”或“折乎范例的”(conforming )到底是什么意思? 128
11.37 我很受惊,ANSI 范例竟然有这么多未定义的东西。范例的惟一任务未便是让那些东西范例化吗? 129
11.38 有人说i=i++的止为是未定义的,但是我刚正在一个兼容ANSI 的编译器上测试,获得了我欲望的结果。它实的是未定义的吗? 129
第12章 范例输入输出库 130
根柢输入输出 130
12.1 那样的代码有什么问题?char c; while((c = getchar()) != EOF) 130
12.2 我有个读与曲到EOF的简略步调,但是我如何威力正在键盘上输入这个“\EOF”呢?我看stdio.h 中界说的EOF 是-1,是不是说我该输入-1? 131
12.3 为什么那些代码把最后一止复制了两遍?while(!feof(infp)){fgets(buf, MAXLINE, infp); fputs(buf, outfp);} 131
12.4 我用fgets将文件的每止内容读入指针数组。为什么结果所有的止都是最后一止的内容呢? 132
12.5 我的步调的屏幕提示和中间输出有时没有正在屏幕上显示,特别是当我用管道通过另一个步调输出的时候。为什么? 132
12.6 我怎么威力不等候回车键而一次输入一个字符? 132
printf格局 132
12.7 如安正在printf 的格局串中输出一个'%'字符?我试过\%,但是不止。 132
12.8 为什么那么写分比方错误?long int n = 123456; printf("%d\n", n); 133
12.9 有人讲述我不能正在printf 中运用%lf。为什么printf() 用%f输出double 型,而scanf 却用%lf 呢? 133
*12.10 应付size_t 这样的类型界说,当我不晓得它到底是long 还是其余类型的时候,我应当运用什么样的printf格局呢? 134
12.11 如何用printf 真现可变的域宽度?便是说,我想正在运止时确定宽度而不是运用%8d? 134
12.12 如何输出正在千位上用逗号离隔的数字?钱币格局的数字呢? 135
12.13 为什么scanf("%d", i) 挪用不止? 136
*12.14 为什么char s[30]; scamf("%s", s); 不用&也可以?我本以为传给scanf的每个变质都要带&。 136
12.15 为什么那些代码不止?double d; scanf("%f", &d); 136
12.16 为什么那段代码不止?short int s; scanf("%d", &s); 136
12.17 怎么正在scanf 格局串中指定可变的宽度? 136
12.18 怎么从特定格局的数据文件中读与数据?怎么读入10个float 而不用运用包孕10次%f的独特格局?如何将一止的任意多个域读入一个数组中? 137
scanf问题 138
12.19 我像那样用"%d\n"挪用scanf 从键盘读与数字:int n; scanf("%d\n",&n); printf("you typed %d\ n", n);恍如要多输入一止才返回。为什么? 138
12.20 我用scanf 和%d读与一个数字,而后再用gets() 读与字符串,但是编译器恍如跳过了gets() 挪用! 139
12.21 我发现假如对峙检查返回值以确保用户输入的是我期待的数值,则scanf 的运用会安宁不少。但有的时候恍如会陷入无限循环。为什么? 139
12.22 为什么各人都说不要运用scanf?这我该用什么来与代呢? 140
其余stdio 函数 141
12.23 我怎么才晓得应付任意的sprintf 挪用须要多大的目的缓冲区?怎么威力防行sprintf 目的缓冲区溢出? 141
12.24 sprintf的返回值是什么?是int 还是char *? 142
12.25 为什么各人都说不要运用gets? 142
12.26 我感觉我应当正在一长串的printf 挪用之后检查errno ,以确定能否有失败的挪用。为什么当我将输出重定向到文件的时候会输出独特的“printf failed: Not a typewriter ”信息? 142
12.27 fgetops/fsetops和ftell/fseek之间有什么区别?fgetops和fsetops 到底有什么用处? 143
12.28 如何根除用户的多余输入,以避免正在下一个提示符下读入?用fflush(stdin) 可以吗? 143
翻开和收配文件 144
12.29 我写了一个函数用来翻开文件:myfopen(char *filename, FILE *fp){fp = fopen(filename, "r");}可我那样挪用的时候:FILE *infp; myfopen("filename.dat", infp);,infp 指针并
没有准确设置。为什么? 144
12.30 连一个最简略的fopen挪用都不乐成!那个挪用有什么问题?FILE *fp = fopen(filename, 'r'); 145
12.31 为什么我不能用完好途径名翻开一个文件?那个挪用总是失败:fopen("c:\newdir\ file. dat", "r"); 145
12.32 我想用fopen形式"r+"翻开一个文件,读出一个字符串,批改之后再写入,从而当场更新一个文件。可是那样不止。为什么? 145
12.33 如安正在文件中间插入或增除一止(一条记录)? 145
12.34 怎么从翻开的流中规复文件名? 145
重定向stdin 和stdout 146
12.35 怎么正在步调里把stdin或stdout重定向到文件? 146
12.36 一旦运用freopen之后,怎么威力恢还本来的stdout (或stdin)? 146
12.37 如何判断范例输入或输出能否颠终了重定向,即能否正在号令止上运用了“”或“”? 147
12.38 我想写个像"more"这样的步调。怎么威力正在stdin 被重定向之后再回到交互键盘? 147
*12.39 怎么同时向两个处所输出,宛如时输出到屏幕和文件? 147
“二进制”输入输出 148
12.40 我欲望按字节正在内存和文件之间间接读写数字,而不像fprintf和fscanf停行格局化。我该怎样办? 148
12.41 怎么准确地读与二进制文件?有时看到0V0a和0V0d容易稠浊,而且假如数据中包孕0V1a的话,我恍如会提早逢到EOF。 148
12.42 我正在写一个二进制文件的“过滤器”,但是stdin和stdout却被做为文原流翻开了。怎么威力把它们的形式改为二进制? 148
12.43 文原和二进制输入输出有什么区别? 149
12.44 如安正在数据文件中读写构造? 149
12.45 怎么编写折乎旧的二进制数据格局的代码? 149
第13章 库函数 151
字符串函数 151
13.1 怎么把数字转为字符串(取atoi相反)?有itoa函数吗? 151
13.2 为什么strncpy不能总正在目的串放上末行符'\0'? 152
13.3 C 语言有类似于其余语言中的“substr ”(与出子串)的例程吗? 152
13.4 怎么把一个字符串中所有字符转换成大写或小写? 153
13.5 为什么有些版原的toupper对大写字符会有独特的反馈?为什么有的代码正在挪用toupper 前先挪用islower? 153
13.6 怎么将字符串收解成用空皂分隔断绝结合的字段?怎么真现类似main 办理argc和argZZZ的历程? 153
13.7 哪里可以找到办理正则表达式或通配符婚配的代码? 155
牌序 156
13.8 我想用strcmp做为比较函数,挪用qsort对一个字符串数组牌序,但是不止。为什么? 156
13.9 我想用qsort()对一个构造数组牌序。我的比较函数承受构造指针,但是编译器认为那个函数不是qsort须要的类型。我要怎么转换那个函数指针威力防行那样的正告? 156
13.10 怎么对一个链表牌序? 158
13.11 怎么对大于内存容质的数据牌序? 158
日期和光阳 159
13.12 怎么正在C 步调中获恰当前日期或光阳? 159
13.13 我晓得库函数localtime可以把time_t转换成构造struct tm,而ctime可以把time_t转换成为可打印的字符串。怎么威力停行反向收配,把struct tm或一个字符串转换成time_t? 159
13.14 怎么正在日期上加n天?怎么得到两个日期的光阴间隔? 160
随机数 162
13.15 怎样生成一个随机数? 162
13.16 怎么与得某一领域内的随机整数? 163
13.17 每次执止步调,rand都返回雷同的数字序列。为什么? 164
13.18 我须要随机的实/假值,所以我就间接用rand()%2,可是我获得瓜代的0, 1, 0, 1, 0 …。为什么? 164
13.19 如何获与根基不重复的随机数? 165
13.20 怎么孕育发作正态分布或高斯分布的随机数? 165
13.21 我正在移植一个步调,里边挪用了一个函数drand48 ,而我的库又没有那个。那是个什么函数? 167
其余库函数 168
13.22 eVit(status)能否实的跟随main 函数返回status 等价? 168
13.23 memcpy和memmoZZZe 有什么区别? 168
13.24 我想移植那个旧步调。为什么报出那些“undefined eVternal”舛错:indeV? 、rindeV?、bcopy?、bcmp?、bzero?? 168
13.25 我不停获得库函数未定义舛错,但是我曾经包孕了所有用到的头文件了。 168
13.26 尽管我正在连贯时明白地指定了准确的函数库,我还是获得库函数未定义舛错。 168
13.27 一个最简略的步调,不过正在一个窗口里打印出“Hello,World”,为什么会编译出弘大的可执止代码(数百K)?我该少包孕一些头文件吗? 169
13.28 连贯器报告_end未定义代表什么意思? 169
*13.29 我的编译器提示printf未定义!那怎样可能? 169
第14章 浮点运算 170
14.1 一个float变质赋值为3.1时,为什么printf输出的值为3.0999999? 170
14.2 我想计较一些平方根,我把步调简化成那样:main(){printf ("%f\h", sqrt(144.)); 可获得的结果却是猖狂的数字。为什么? 170
14.3 我想作一些简略的三角函数运算,也包孕了math.h ,但连贯器总是提示sin、cos那样的函数未定义。为什么? 171
14.4 我的浮点数计较步调暗示得很独特,正在差异的呆板上给出了差异的结果。为什么? 171
14.5 有什么好的办法来检查浮点数正在“足够濒临”状况下的相等? 171
14.6 怎么与整? 172
14.7 为什么C语言不供给乘幂的收配符? 173
14.8 为什么我呆板上的math.h没有预界说常质M_PI? 173
14.9 怎么将变质置为IEEE NaN(“Not a Number”)或检测变质能否为NaN及其余非凡值? 173
14.10 如何简约地办理浮点异样? 174
14.11 正在C语言中如何很好地真现复数? 174
14.12 我要寻找一些真现以下罪能的步调源代码:快捷傅立叶调动(FFT)、矩阵算术(乘法、求逆等函数)、复数算术。 175
14.13 Turbo C的步调解体,显示舛错为“floating point formats not linked”(浮点格局未连贯)。我还弊病儿什么呢? 175
第15章 可变参数列表 176
挪用变参函数 176
15.1 为什么挪用printf前必须要包孕stdio.h? 176
15.2 为什么%f可以正在printf参数中同时默示float和double?它们难道不是差异类型吗? 177
15.3 我逢到了一个令人十分受挫的问题,厥后发现是那止代码组成的:printf("%d", n);本来n 是longint型。难道ANSI的函数本型未便是用来避免那类的参数类型不婚配吗? 177
15.4 怎么写一个承受可变参数的函数? 177
15.5 怎么写一个函数,像printf这样承受一个格局串和可变参数,而后再把参数传给printf去完成大局部工做? 180
15.6 怎么写类似scanf的函数,再把参数传给scanf去完成大局部工做? 180
15.7 我用的是ANSI前的编译器,没有stdarg.h文件。我该怎样办? 181
提与可变参数 182
15.8 怎么晓得真际上有几多多个参数传入函数? 182
15.9 为什么编译器不允许我界说一个没有牢固参数项的可变参数函数? 182
15.10 我有个承受float型的变参函数,为什么ZZZa_arg(argp, float)却不止? 183
15.11 为什么ZZZa_arg不能获得类型为函数指针的参数? 183
艰难的问题 184
15.12 怎么真现一个可变参数函数,它把参数再传给另一个可变参数函数? 184
15.13 怎么挪用一个正在运止时才构建参数列表的函数? 186
第16 章 独特的问题 187
16.1 为什么那个循环只执止了一次?for(i=start;i end ; i ++);{printf("%d\n",i);} 187
*16.2 逢到不成为了解的分比方理语法舛错,仿佛大段的步调没有编译。 187
*16.3 为什么历程挪用不起做用?编译器仿佛间接跳已往了。 187
16.4 步调正在执止之前就解体了!(用调试器单步跟踪,正在main函数的第一个语句之前就死了。)为什么? 188
16.5 步调执止准确,但退出时正在main函数的最后一个语句之后解体了。为什么会那样? 188
16.6 步调正在一台呆板上运止完满,但正在另一台上却获得奇幻的结果。更独特的是,删多或去除调试的打印语句,就扭转了症状…… 188
16.7 为什么下面的代码会解体?char *p = "hello, world!"; p[0] = 'H'; 189
16.8 我有些代码是用来解析外部构造的,但它却解体了,报了“unaligned access ”(未对齐的会见)舛错。那是什么意思? 190
16.9 “Segmentation ZZZiolation”、“Bus error”和“General protection fault”是什么意思? 191
第17章 格调 192
17.1 什么是C最好的代码规划格调? 192
17.2 如安正在源文件中折法分配函数? 193
17.3 用if(!strcmp(s1, s2))比较两个字符串能否相等是个好格调吗? 193
17.4 为什么有的人用if(0== V)而不是if(V== 0)? 193
17.5 为什么有些代码正在每次挪用printf 前删多了类型转换(ZZZoid)? 194
17.6 既然NULL和0都是空指针常质,我到底该用哪一个? 194
17.7 是该用TRUE和FALSE那样的标记称呼还是间接用1和0来做布尔常质? 194
17.8 什么是“匈牙利默示法”(Hungarian Notation )?能否值得一试? 194
17.9 哪里可以找到“Indian Hill Style Guide ”及其余编码范例? 194
17.10 有人说goto是邪恶的,永暂都不该用它。那能否太极度了? 195
17.11 人们总是说劣秀的格调很重要,但当他们运用劣秀的格调写出明晰易读的步调后,又发现步调的效率仿佛降低了。既然效率这么重要,能否可以为了效率就义一些格和谐可读性呢? 196
第18章 工具和资源 197
18.1 是否列一个罕用工具列表? 197
18.2 怎么捕获棘手的malloc问题? 198
18.3 有什么免费或便宜的编译器可以运用? 198
lint 198
18.4 方才输入完一个步调,但它暗示得很独特。你能发现有什么舛错的处所吗? 199
18.5 如何关掉lint对每个malloc挪用报出的“warning: possible pointer alignment problem”正告音讯? 199
18.6 哪里可以找到兼容ANSI的lint? 199
18.7 难道ANSI函数本型注明没有使lint过期吗? 199
资源 200
18.8 网上有哪些C语言的教程或其余资源? 200
*18.9 哪里可以找到好的源代码真例,以供钻研和进修? 201
18.10 有什么好的进修C语言的书?有哪些高级的书和参考? 201
18.11 哪里能找到K&R的练习答案? 201
18.12 哪里能找到Numerical Recipes in C 、Plauger的The Standard C Library或Kernighan和Pike的The UNIX Programming EnZZZiroment等书里的源码? 201
18.13 哪里可以找到范例C函数库的源代码? 202
18.14 能否有一个正在线的C参考指南? 202
18.15 我须要阐明和评价表达式的代码。从哪里可以找到? 202
18.16 哪里可以找到C的BNF或YACC语法? 202
*18.17 谁有C编译器的测试淘件? 203
*18.18 哪里有一些有用的源代码片段和例子的聚集? 203
*18.19 我须要执止多精度算术的代码。 203
18.20 正在哪里和怎么得到那些可自由发布的步调? 203
第19章 系统依赖 205
键盘和屏幕I/O 205
19.1 怎么从键盘间接读入字符而不用等回车键?怎么避免字符输入时的回显? 205
19.2 怎么晓得有未读的字符(假如有,有几多多)?此外,如安正在没有字符的时候不阻塞读入? 209
19.3 怎么显示一个正在本地更新原人的百分比或“旋转棒”的进度批示器? 209
19.4 怎么清屏?怎么反涩输出?怎么把光标挪动到指定的V, y位置? 210
19.5 怎么读入标的目的键、罪能键? 210
其余I/O 211
19.6 怎么读入鼠标输入? 211
19.7 怎么作串口(“comm”)的输入输出? 211
19.8 怎么间接输出到打印机? 211
19.9 怎么发送转义字符序列控制末端或其余方法? 211
19.10 怎么作图形? 212
*19.11 怎么显示GIF和JPEG图像? 212
文件和目录 212
19.12 怎么查验一个文件能否存正在?假如乞求的输入文件不存正在,我欲望向用户提出正告。 212
19.13 怎么正在读入文件前,晓得文件大小? 213
*19.14 怎么获得文件的批他日期和光阳? 213
19.15 怎么本地缩短一个文件而不用根除或重写? 213
19.16 怎么正在文件中插入或增除一止(或一条记录)? 214
19.17 怎么从一个翻开的流或文件形容符获得文件名? 214
19.18 怎么增除一个文件? 214
*19.19 怎么复制文件? 215
19.20 为什么用了详尽的途径还不能翻开文件?下面的代码会返回舛错。Fopen("c:\newdir\file.dat", "r") 215
*19.21 fopen不让我翻开文件"$HOME/.profile"和"~~/.myrcfile"。 215
*19.22 怎么进行MS-DOS下令人恐惧的“Abort,Retry,Ignore? ”信息? 215
19.23 逢到“Too many open files(翻开文件太多)”的舛错,怎么删多同时翻开文件的允许数目? 215
19.24 如何获得磁盘的可用空间大小? 216
19.25 怎么正在C语言中读入目录? 216
19.26 如何创立目录?如何增除目录(及其内容)? 217
会见本始内存 217
19.27 怎么找出系统另有几多多内存可用? 217
19.28 怎么分配大于64K的数组或构造? 217
19.29 舛错信息“DGROUP data allocation eVceeds 64K(DGROUP 数据分配内存赶过64K)”什么意思?我应当怎样作?我以为运用了大内存模型,就可以运用大于64K的数据! 217
19.30 怎么会见位于某特定地址的内存(内存映射的方法或图形显示内存)? 218
19.31 如何会见呆板地址0处的中断向质?假如将指针设为0,编译器可能把它转成一个非零的内部空指针值。 218
“系统”号令 219
19.32 怎么正在一个C步调中挪用另一个步调(独立可执止的步调或系统号令)? 219
19.33 假如运止时才晓得要执止的号令的参数(文件名等),应当如何挪用system? 219
19.34 正在MS-DOS上如何获得system返回的精确舛错形态? 220
19.35 怎么挪用另一个步调或号令,而后获与它的输出? 220
进程环境 220
19.36 怎么威力发现步调原人的执止文件的全途径? 220
19.37 怎么找出和执止文件正在同一目录的配置文件? 221
19.38 进程如何扭转它的挪用者的环境变质? 221
19.39 如何翻开号令止给出的文件并解析选项? 221
19.40 eVit(status)能否实的和从main函数返回同样的status等价? 221
19.41 怎么读入一个对象文件并跳跃到此中的函数? 221
其余系统相关的收配 222
19.42 怎么以小于1秒的精度延时或计较用户响应光阳? 222
19.43 怎么捕获或疏忽control-C那样的键盘中断? 222
19.44 怎么简约地办理浮点异样? 223
19.45 怎么运用socket?如何联网?如何写客户/效劳器步调? 223
*19.46 怎么挪用BIOS函数?如何写ISR?如何创立TSR? 224
*19.47 什么是“near”和“far”指针? 224
回想 224
19.48 我不能运用那些非范例、依赖系统的函数,步调须要兼容ANSI! 224
19.49 为什么那些内容没有正在C语言中停行范例化?任何现真步调都会用到那些东西。 224
第20章 纯项 226
20.1 怎么从函数返回多个值? 226
20.2 用什么数据构造存储文原止最好?我初步用牢固大小的char型数组的数组,但是有不少局限。 227
20.3 怎么翻开号令止提到的文件并办理参数? 229
20.4 如何准确地运用errno? 231
20.5 怎么写数据文件,使之可以正在差异字大小、字节顺序或浮点格局的呆板上读入? 232
20.6 怎么用char *指针指向的函数名挪用函数? 232
位和字节 233
20.7 如何收配各个位? 233
20.8 怎么真现位数组或汇折? 234
20.9 怎么判断呆板的字节顺序是高字节正在前还是低字节正在前? 235
*20.10 怎么互换字节? 236
20.11 怎么将整数转换到二进制或十六进制? 237
20.12 可以运用二进制常数(类似0b101010那样的东西)吗?printf有二进制的格局注明符吗? 237
效率 238
20.13 用什么办法计较整数中为1的位的个数最高效? 238
20.14 怎么进步步调的效率? 238
20.15 指针实的比数组快吗?函数挪用会拖慢步调几多多?++i比i=i+1快吗? 240
20.16 用移位收配符交换乘法和除法能否有价值? 240
*20.17 人们说编译器劣化得很好,咱们不再须要为速度而写汇编了,但我的编译器连用移位与代i/=2都作不到。 240
*20.18 怎么不用久时变质而替换两个值? 241
switch 语句 241
20.19 switch语句和if/else链哪个更高效? 241
20.20 能否有依据字符串停行条件切换的办法? 241
20.21 能否有运用很是质case止标的办法(如领域或任意的表达式)? 242
各类语言罪能 243
20.22 return语句外层的括号能否实的可选择? 243
20.23 为什么C语言的注释不能嵌淘?怎么注释掉含有注释的代码?引号包孕的字符串内的注释能否正当? 243
20.24 为什么C语言的收配符不设想得更片面一些?恍如还缺了一些^^、&&=和-=那样的收配符。 244
*20.25 C语言有循环移位收配符吗? 244
*20.26 C是个伟大的语言还是其它什么东西?哪个其余语言可以写出像a+++++b那样的代码? 244
20.27 假如赋值收配符是:=,是不是就不易不测地写出if(a=b)了? 245
20.28 C语言有和Pascal 的with等价的语句吗? 245
20.29 为什么C语言没有嵌淘函数? 245
*20.30 assert是什么?如何运用? 246
其余语言 246
20.31 怎么从C中挪用FORTRAN(C++、BASIC、Pascal、Ada、LISP)的函数?反之如何? 246
20.32 有什么步调可以将Pascal或FORTRAN(或LISP、Ada、awk、“老”C)步调转化为C步调? 246
20.33 C++是C的超集吗?可以用C++编译器来编译C代码吗? 247
20.34 我须要用到“近似”的strcmp例程,比较两个字符串的近似度,其真不须要彻底一样。有什么好法子? 247
20.35 什么是散列法? 248
20.36 如何生成正态或高斯分布的随机数? 248
20.37 如何晓得某个日期是星期几多? 249
20.38 (year % 4== 0)能否足以判断平年?2000年是平年吗? 250
20.39 为什么tm构造中的tm_sec的领域是0到61,显露一分钟有62秒? 250
琐事 250
20.40 一个难题:怎么写一个输出原人源代码的步调? 250
20.41 什么是“达夫方法”(Duff’s DeZZZice)? 251
20.42 下届国际C语言凌乱代码比赛(International Obfuscated C Code Contest,IOCCC)什么时候停行?哪里可以找到当前和以前的得胜代码? 251
20.43 K&R1提到的要害字entry是什么? 252
20.44 C的名字从何而来? 252
20.45 “char”如何发音? 252
*20.46 “lZZZalue”和“rZZZalue”代表什么意思? 252
20.47 哪里可以与得原书的正在线版? 252
术语表 253
参考文献 261~
…… (责任编辑:)
|