最新C语言计算机_第1页
最新C语言计算机_第2页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 在 1973 年,美国贝尔实验室的 D.M.Ritchie(丹尼斯里奇)在 B 语言的基础 上最终设计出了一种新的语言,他取了 BCPL 的第二个字母作为这种语言的名字,这 就是 C 语言,并首次用 C 重新实现了 UNIX 操作系统。 1978 年 Brian W. Kernighan 和 Dennis M. Ritchie 出版的名著C 程序设计 语言(The C ProgrammingLanguage,常被人们称为 K&R 版 C 教材或“白皮书”, 为 C语言的推广普及立下汗马功劳。在书籍方面我还要极力推荐的一本精典著作就 是C 和指针,写的特别深入、详细。 1、 C 语言

2、是一门兼具高级语言功能和低级语言大部分功能的程序开发语言, 所 以既能开发应用软件也能开发系统软件。 2、 C 程序是由函数构成的,一个 C 源程序至少且仅包含一个 main 函数。一个 C 程序总是从 main 函数开始执行的,而不论 main 函数在整个程序的位置如何。 main(int argc,char *c) 主函数也可以带参数,此时在命令行执行 test.exe ma wentao,那么总共有三个参数, argc 就等于 3, c0是源程序名test.exe , c1 是 ma,c2 是 wen, c3 是 tao。 3、 C 语言是严格区分大、小写的,比如定义变量时:int a

3、和 int A 是两个完 全不同的变量。 4、 C 语言中整常数可以有 3 种表示形式: (1) 默认为十进制。 (2) 以 0 开头为八进制,如: 0123 表示八进制 123,十进制为 83。 (3) 以 0 x 开头为十六进制 ( 没有直接表示二进制格式, 所以可以用十六进制表示 ), 如: 0 x123。 2 5、 数据类型的长度由编译器决定, 比如 Turbo C 给 int 型变量分配 2 个字节的 存储单元,而 Visual C+6.0 则分配 4 字节。 这里简单说下 C 语言变量在内存中的存储位置: (1) 全局变量和静态变量都在静态内存区, 说白了也就是普通内存区即进程所分

4、 配的地址空间,当程序退出自动释放。 (2) 函数的参数和局部变量都在堆栈中, 函数退出后这些变量都会自动出栈, 即 释放内存。 (3) 用 malloc 、 calloc 、 realloc 分配的内存属于堆区,必须手动调用 free 函 数释放,否则会造成内存泄露。 (4) 寄存器变量 , 直接存储在寄存器中,存取值速度快,只有局部自动 ( 非静态 ) 变量和形式参数可以这样定义。如: register . 6、 整数默认就是有符号数,浮点型常量默认为双精度,有些编译器比如 Turbo C 把字符型变量默认定义为 signed char 型,即有符号字符,这样它的范围就是-128 到 12

5、7 之间了,但有些编译器默认字符是无符号 (unsigned char) 的,范围在 0 到 255 之间。 7、 %模运算符 (求余数)两侧均应为整型数据。 8、 变量使用前必须先声明,而且声明要在代码之前 ( 即变量声明紧随代码块左 大括号)。 9、 关系运算符 (,=,=,!=) 的判断结果有真 , 假两个值 , 真值用非 0 表示 , 假用 0 表示,没有 true 和 false 等关键字。 C 语言的逻辑运算符(&,|,!)与、或、非的判断结果是假则值为 0,结果为 真则值为非 0(包括任何非 0 数)。 10、 逻辑表达式在求解中,并不是所有的逻辑运算符都被执行,只是在必

6、须执 行下一个逻辑运算符后才能确定表达式结果时才执行后面运算,比如: a&b&(如 果a 为真(非 0)才去计算 b,如果 a 为假(0)则 b 和 c 都不会去执行,最终结果就是 假。 11、 if 语言的判断条件是一个关系表达式或逻辑表达式, 由于逻辑表达式的真 用非 0 代表,所以 if 语句的判断条件可以是 0 和任意非 0 数值,包括(整数、实型、 字符3 型、指针型),如:if(3) printf(0k); 或者 if(a)printf(no); 都是 合法的。切记即使在条件判断和循环判断中传的是负数也会为真,即 if(-2).while(-1) 等等这样的表达式都

7、会为真,只要不是 0 就为真。 12、 条件表达式即三目运算符 x?a:b 中 a 和 b 的结果类型不同,则三目运算符 的最终结果会取类型较高的,比如 xy?1:1.5 ,如果 xy 为真则最终结果为 1.0。 13、 for 循环中 for( 表达式 1;表达式 2;表达式 3) ,都可以省略这样就成了 死循环,但分号不能去掉。而且表达式 1 和表达式 3 中都可以包括多个表达式用逗 号分隔如,比如: for(i=1,j=2; i右移操作符: Turbo C 和其他一些编译器采用的是算数右移,即对有符 号数右移时, 如果原来符号位原来为 1,左面移入高位的是 1。如果某个编译器对于 右移采

8、用逻辑右移则永远在高位补 0,所以右移负数时存在不可移植性问题。 23、 位段: C 语言中允许在一个结构体中以位为单位制定其成员所占内存长度, 这种以位为单位的成员称为“位段”或称“位域” 利用位段能够用较少的位数存储数据。 (前提也是在结构体内, 并且类型只能 是 int 、 unsigned int 、 singned int ) 例如: struct data unsigned a:8; unsigned b:2; unsigned c:6; da; 这样定义的结构体 a、b、c 分别占 8 位、2 位、6 位。 24、所有非整形函数一定要在调用之前声明。 ( 没有被声明就调用的函数被

9、默认 为返回整型) 6 (1) 函数前面不写返回值默认就返回整型,但函数体此时可以不返回任何东西, 也可以返回整数。 (2) 函数不返回任何东西, 可以显示的用 void 声明, 比如这样定义主函数 void main() 。 (3) 函数如果没有参数,可以用 void 显示说明,即 void remove(void) 25、字符常数是 int 型,因此 sizeof(a) 是 sizeof(int) 即值为 4,而不是 1。 26、关键字 const 并不能把变量变成常量,在一个符号前加上 const 限定符只 是表示这个符号不能被赋值,可以初始化一次。 注意: const int * p;

10、 和 int const * p; 都叫常量指针 ( 这种读法很简单,因 为先是 const 再是*) ,都是指针所指的对象不能修改。 int * const p; 这和字符串常量、数组名 ( 当做指针时 ) 一样都叫指针常量 , 表示 指针本身是不可变的。 const int * const p; 和 int const * const p; 表示指针和所指对象都是只 读的。 27、void *v 类型参数是一个通用的指针类型,即这种类型的指针可以转换成 任意具体类型的指针,但它不可以移动,比如: v+,v-1 等等,这是因为此指针所 指向的对象大小无法确定,那么它自然就不知道 +1 是移动

11、多少了。 ( 这个解释实在 太经典了,嘿嘿 ) 、J 5 八、八、 ) 28、C 语言在定义数组时,需要指定数组中元素的个数,方括号中的表达式用 来表示元素的个数,即数组长度。下标只能是表达式常量和符号常量,不能包含变 量,也就是说C 语言不允许对数组大小作动态定义,即数组的大小不依赖于程序运 行过程中的变量值 例如: int a=10; int sa; 这样是错误的。 C语言在编译时就要确定任何变量的存储空间大小, 包括数组。(可以想想汇 编数据段中的内存分配 ) 7 29、 0123456789n%10这个表达式将返回 n(整数)的最后一位数值,别忘了字 符串常量就是一个指针常量。 (为了

12、防止字符表中的数字没有顺序排列 ) 30、 对于参数的计算顺序和整形数右移是否扩展符号位,标准都没有规定,只 能依赖编译器了。 31、 C 语言中两个字符串常量会自动合并。 比如 char a=mawentao; 等价 于 char a=mawentao; 32、 有好多人经常问标准库函数到底是在哪里实现的?为什么我们很简单的用 include 包含后,可就是找不到 math 的实现,感觉很奇怪,之前我也觉得 很好奇,其实等你了解了动态链接 (.dll) 、引用链接库 (.lib) 一切都会明白了,在 编译器的某个文件夹下存在好多.dll 和.lib 文件,其中 dll 文件就是动态链接库,

13、内部就是函数的实现, lib 库中有那些函数名的声明引用, 当系统发现你调用 pow() 函数时,就会去相应文件夹下 lib 文件中找到 pow在哪个动态库中调用了,然后把 动态库中的此函数体自动加载到内存执行,大概过程就是这样。 33、 C 语言把文件看做一个字符(字节) 序列, 即 C 文件是一个字节流或二进制 流,根据数据的组织形式不同, 可以分为 ascii 文件和二进制文件 ascii 文件也叫 文本文件,它的每一个字节存放一个 ascii 代码,代表一个字符。二进制文件是把 内存中的数据按其在内存中的存储形式原样输出到文件磁盘上存放。 注意文本 /二 进制文件区别只是发生在文件打开

14、时,一旦文件打开之后,在其上调用什么 I/O 函 数无关紧要。 用 fopen 打开文件时,路径有两种写法:双反斜杠 / 、单正斜杠 / 。 34、有些专家建议在 C 语言的操作符中牢记两个优先级就够了:乘法和除法优 先于加法和减法,在涉及到其他操作符时,一律加上括号。虽然有点夸张了,但我 觉得我们真不应该把时间浪费在死记操作符的优先级上,而且为了代码的可读性和 维护性就应该多加括号。 35、 i=*x/*y; 这里本意是指针 x 所指向的内容除以指针 y 所指向的内容然后赋 给 i ,但/* 被理解为注释开始了,编译器会报错,所以 / 和*之间必须加上空格。这 也是空格作用体现的一个很好例子

15、, 因此我们在写代码时一定要养成一个好的习惯, 操作符两边都以空8 格分隔。 37、函数内部不能返回一个局部数组指针,如 int* f()int a3=1,2,4; return a;,这样返回了一个指针 a,但函数结束后整个数组都被释放,a 指向的内 存内容是个未知的,或许已经被别的内容覆盖,这是很危险的。 38、 声明只确定了变量的基本类型以及初始值 (如果有的话 ). 39、 如何解析 C 语言声明? 1 、取最左边的标示符 ( 变量名 ) 2 、查看标示符右边的下一个符号, 如果是方括号对于每一对方括号表示“ . 的数组”;如果是一个左括号,到右括号为止的内容表示“返回 . 的函数”;

16、 (如 果变量名临近右边无任 何有价值的符号就直接走第 3 步,比如 int (*p)2) 3 、接着查看的左边符号,如果是一个左括号,这个左括号把已经处理的部 分声明组合在一起,直到遇见对应的右括号,然后从第 2 步从新开始; 4 、 上面三部分析完后, 在看已经处理的部分左边的符号如果是下述之一: const 、volatile 、 *, 则继续向左边读符号 ,直到所读符号不再是上面那三个之一。 如果符号是 const,表示“只读”;如果是 volatile 表示volatile;如果是*,表 示“指向 . 的指针”然后重复第三步; 5 、剩下的符号形成声明的基本类型,剩下的所有符号可以一

17、并阅读,如: static unsigned int 。 切记: const 或 volatile 关键字后面如果紧跟类型说明符如 (int 、long), 则它作用于类型说明符,其他情况下都作用于左边的临近指针星号。 举例比如: char * const *(*next)(); 我们来简单分析下这个声明,就按照上面的 5 个步骤进行: 1 、取最左边的标示符: next ,表示变量 next 是个 . ; 2 和 3 都不匹配; 4 、next 左边是*,表示“ next 是指向. 的指针”;再重复第三步, 匹配到 了一9 对小括号后再从第二步开始, 表示“返回 . 的函数”; 接着又到第三

18、步: 不匹 配,再去第四步:左边遇到一个*即(*next)外面紧跟 const 的那个*,表示“指向 的指针”,因为右边我们已经分析完了就不再看前三步了,继续第四步遇到了 const ,“表示只读”;再又是一个“指向 . 的指针”,最后就是 char 类型定义了。 上面所有合起来就是 next 是一个指向函数的指针,该函数返回另一个指 针,该指针指向一个只读的指向 char 的指针。 再举例: char *(* c10)(int *p) 就表示: c 是一个指针数组,即里面的元素全是 指针,每个指针都指向一个函数,即函数指针,该函数有个指向 int 型指针的指针 的参数,返回值是个 char 型指针。 注意: 在数组中被函数指针指向的所有函数都把一个指向指针的指针作为 它们的唯一参数。 (上面就是一个例子 ) 40、关于补码请记住:对于有符号数, 正数和负数都是由补码构成的。 (汇编语 言) 一个正数的补码取反加 1 后,为其负数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论