Chapter1—5
1、在C语言中,所有变量都必须先声明后使用。声明通常放在函数起始处,在任何可执行语句之前。
2、指出,printf函数并不是C语言本身的一部分,C语言本身并没有定义输入/输出功能。printf 仅仅是标准库函数中一个有用的函数而已。
3、
4、一维数组的定义和初始化符号常量:#define 指令可以把符号名(或称为符号常量)定义为一个特定的字符串
#define 名字 替换文本 //末尾没有分号,符号常量名通常用大写字母拼写
#define后的名字在预处理阶段被替换,但#define前的名字不会被替换
5、标准库提供了一次读/写一个字符的函数,其中最简单的是 getchar 和putchar 两个函数。每次调用时,getchar 函数从文本流中读入下一个输入字符,并将其作为结果值返回。
6、EOF 定义在头文件<stdio.h>中,是个整型数。
7、不等于运算符!=的优先级比赋值运算符=的优先级要高
8、运算符&&代表 AND(逻辑与),它仅比||高一个优先级。由&&或||连接的表达式由左至右求值,并保证在求值过程中只要能够判断最终的结果为真或假,求值就立即终止。
9、在 C 语言中,所有函数参数都是“通过值”传递的。也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中。
10、当把数组名用作参数时,传递给函数的值是数组起始元素的位置或地址——它并不复制数组元素本身。
11、在源文件中,如果外部变量的定义出现在使用它的函数之前,那么在那个函数中就没
有必要使用 extern 声明。
12、如果程序包含在多个源文件中,而某个变量在 file1 文件中定义、在 file2 和 file3文件中使用,那么在文件 file2 与 file3 中就需要使用 extern 声明来建立该变量与其之间的联系。人们通常把变量和函数的 extern 声明放在一个单独的文件中(习惯上称头文件),并在每个源文件的开头使用#include 语句把所要用的头文件包含进来。
13、在ANSI C 中,如果要声明空参数表,则必须使用关键字 void 进行显式声明。
14、“定义”表示创建变量或分配存储单元,而“声明”指的是说明变量的性质,但并不分配存储单元。
15、有关数据类型长度定义的符号常量以及其它与机器和编译器有关的属性可以在标准头文
件<limits.h>与<float.h>中到。
件<limits.h>与<float.h>中到。
16、常量表达式是仅仅只包含常量的表达式。这种表达式在编译时求值,而不在运行时求值。
17、字符常量'\0'表示值为 0 的字符,也就是空字符(null)。
18、字符串常量就是字符数组,字符串的内部表示使用一个空字符'\0'作为串的结尾,因此。存储字符串的物理存储单元数比括在双引号中的字符数多一个。
19、标准库函数strlen(s)可以返回字符串参数s 的长度,但长度不包括末尾的'\0'。
20、标准头文件<string.h>中声明了 strlen 和其它字符串函数。
21、枚举是一个常量整型值的列表,例如:enum boolean { NO, YES };在没有显式说明的情况下,enum 类型中第一个枚举名的值为 0,第二个为 1,依此类推。如果只指定了部分枚举名的值,那么未指定值的枚举名的值将依着最后一个指定值向后递增。
22、不同枚举中的名字必须互不相同。同一枚举中不同的名字可以具有相同的值。
23、默认情况下,外部变量与静态变量将被初始化为 0。未经显式初始化的自动变量的值为未定义值(即无效值)。
24、一般来说,自动转换是指把“比较窄的”操作数转换为“比较宽的”操作数,并且不丢失信
息的转换。
25、一个声明指定一种变量类型,后面所带的变量表可以包含一个或多个该类型的变量。
26、在声明的同时对变量进行初始化。在声明中,如果变量名的后面紧跟一个等号以及一个表达式,该表达式就充当对变量进行初始化的初始化表达式。如果变量不是自动变量,则只能进行一次初始化操作,从概念上讲,应该是在程序开始执行之前进行,并且初始化表达式必须为常量表达式。
27、标准头文件<ctype.h>定义了一组与字符集无关的测试和转换函数。例如,tolower(c)函数将 c 转换为小写形式。语句c >= '0' && c <= '9'可以用该标准库中的函数isdigit(c)替代。
28、const 限定符也可配合数组参数使用,它表明函数不能修改数组元素的值:
int strlen(const char[]);
29、当把较长的整数转换为较短的整数或 char 类型时,超出的高位部分将被丢弃。
30、在对 unsigned 类型的无符号值进行右移位时,左边空出的部分将用 0 填补。当对 signed 类型的带符号值进行右移时,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用 0填补(即“逻辑移位”)。
31、当把 float 类型转换为 int 类型时,小数部分将被截取掉;当把 double 类型转换为 float 类型时,是进行四舍五入还是截取取决于具体的实现。
32、函数 getbits(x, p, n),它返回 x 中从右边数第 p 位开始向右数 n 位的字段。这里假定最右边的一位是第 0 位,n 与 p 都是合理的正值。
33、
34、continue 语句只用于循环语句,不用于 switch 语句。
35、internal 用于描述定义在函数内部的函数参数及变量。
34、外部变量或函数的作用域从声明它的地方开始,到其所在的(待编译的)文件的末尾结束。
35、如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同
一个源文件中,则必须在相应的变量声明中强制性地使用关键字 extern。
36、将外部变量的声明与定义严格区分开来很重要。变量声明用于说明变量的属性(主要是变量的类型),而变量定义除此以外还将引起存储器的分配。
37、对于数组类型的外部变量,在定义时必须指定数组的长度,但 extern 声明则不一定要指定数组的长度。外部变量的初始化只能出现在其定义中。
38、用 static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分。
39、static 也可用于声明内部变量。static 类型的内部变量同自动变量一样,是某个特定函数的局部变量,只能在该函数中使用,但它与自动变量不同的是,不管其所在函数是否被调用,它一直存在,而不像自动变量那样,随着所在函数的被调用和退出而存在和消失。
40、register 声明告诉编译器,它所声明的变量在程序中使用频率较高。其思想是,将register 变量放在机器的寄存器中,这样可以使程序更小、执行速度更快。
41、register 声明只适用于自动变量以及函数的形式参数.
42、过量的寄存器声明并没有什么害处,这是因为编译器可以忽略过量的或不支持的寄存器变量声明。无论寄存器变量实际上是不是存放在寄存器中,它的地址都是不能访问的。
43、变量的声明(包括初始化)除了可以紧跟在函数开始的花括号之后,还可以紧跟在任何其它标识复合语句开始的左花括号之后。以这种方式声明的变量可以隐藏程序块外与之同名的变量,它们之间没有任何关系,并在与左花括号匹配的右花括号出现之前一直存在。
44、在不进行显式初始化的情况下,外部变量和静态变量都将被初始化为 0,而自动变量和寄存器变量的初值则没有定义(即初值为无用的信息)。
45、对于外部变量与静态变量来说,初始化表达式必须是常量表达式,且只初始化一次。
46、对于自动变量与寄存器变量来说,初始化表达式可以不是常量表达式:表达式中可以包
含任意在此表达式之前已经定义的值,包括函数调用。
含任意在此表达式之前已经定义的值,包括函数调用。
47、数组的初始化可以在声明的后面紧跟一个初始化表达式列表,初始化表达式列表用花
括
号括起来,各初始化表达式之间通过逗号分隔。如果初始化表达式的个数比数组元素数少,则对外部变量、静态变量和自动变量来说,没有初始化表达式的元素将被初始化为 0,如果初始化表达式的个数比数组元素数多,则是错误的。
号括起来,各初始化表达式之间通过逗号分隔。如果初始化表达式的个数比数组元素数少,则对外部变量、静态变量和自动变量来说,没有初始化表达式的元素将被初始化为 0,如果初始化表达式的个数比数组元素数多,则是错误的。
48、字符数组的初始化比较特殊:可以用一个字符串来代替用花括号括起来并用逗号分隔的
初始化表达式序列。例如:char pattern[] = "ould ";
初始化表达式序列。例如:char pattern[] = "ould ";
49、从概念上讲,预处理器是编译过程中单独执行的第一个步骤。两个最常用的预处理器指令是:#include 指令(用于在编译期间把指定文件的内容包含进当前文件中)和#define 指令(用任意字符序列替代一个标记)
50、文件包含指令:#include "文件名" 或#include <文件名>
51、如果文件名用引号引起来,则在源文件所在位置查该文件;如果在该位置没有到文件,或者如果文件名是用尖括号<与>括起来的,则将根据相应的规则查该文件,这个规则同具体的实现有关。被包含的文件本身也可包含#include 指令。
52、通常情况下,#define 指令占一行,替换文本是#define 指令行尾部的所有剩余部分内容,但也可以把一个较长的宏定义分成若干行,这时需要在待续的行末尾加上一个反斜杠符\。#define 指令定义的名字的作用域从其定义点开始,到被编译的源文件的末尾处结束。
53、#define max(A, B) ((A) > (B) ? (A) : (B))
54、<stdio.h>头文件中有一个很实用的例子:getchar 与putchar 函数在实际中常常被定义为宏,这样可以避免处理字符时调用函数所需的运行时开销。<ctype.h>头文件中定义的函数也常常是通过宏实现的。
55、预处理器运算符##为宏扩展提供了一种连接实际参数的手段。如果替换文本中的参数与##相邻,则该参数将被实际参数替换,##与前后的空白符将被删除,并对替换后的结果重新扫描。下面定义的宏 paste 用于连接两个参数:#define paste(front, back) front ## back。因此,宏调用 paste(name, 1)的结果将建立记号 name1。
56、可以通过#undef 指令取消名字的宏定义,这样做可以保证后续的调用是函数调用,而
不
是宏调用:#undef getchar
是宏调用:#undef getchar
40、为了保证 hdr.h 文件的内容只被包含一次,可以将该文件的内容包含在下列形式
的条件语句中:
的条件语句中:
41、
42、
43、ANSI C 使用类型 void * (指 向 void的指针)代替 char *作为通用指针的类型。
44、地址运算符&只能应用于内存中的对象,即变量与数组元素。它不能作用于表达式、常量或register 类型的变量。
45、指向 void 类型的指针可以存放指向任何类型的指针, 但它不能间接引用其自身。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论