Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273123
  • 博文数量: 76
  • 博客积分: 1500
  • 博客等级: 上尉
  • 技术积分: 594
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-05 23:43
文章分类

全部博文(76)

文章存档

2014年(4)

2013年(3)

2012年(20)

2011年(49)

分类: C/C++

2011-11-28 15:33:55

1,全局变量与局部变量
如果全局变量在定义时不初始化则初始值是 0,如果局部变量在定义时不初始化则初始值是不确定的。所以,局部变量在使用之前一定要先赋值,如果基于一个不确定的值做后续计算肯定会引入 Bug。

2,goto 语句
goto 语句过于强大了,从程序中的任何地方都可以无条件跳转到任何其它地方,只要在那个地方定义一个标号就行,唯一的限制是 goto 只能跳转到同一个函数中的某个标号处,而不能跳到别的函数中.

3, if {}与定义结构体的{}
但即使像先前的例子那样只定义了 complex_struct 这个 Tag 而不定义变量,"}"后面的";"号也不能少。这点一定要注意,类型定义也是一种声明,声明都要以;号结尾,结构体类型定义的}后面少;号是初学者常犯的错误。
而if {},这个用来组合一个语句块,不是申明。所有"if{}"之类的不用加上","。

4,代码风格糟糕的程序员肯定是不称职的。

5, C 标准 I/O 库函数与 Unbuffered I/O 函数
现在看看 C 标准 I/O 库函数是如何用系统调用实现的。
fopen(3)
调用 open(2)打开指定的文件,返回一个文件描述符(就是一个 int 类型
的编号),分配一个 FILE 结构体,其中包含该文件的描述符、I/O 缓冲区
和当前读写位置等信息,返回这个 FILE 结构体的地址。
fgetc(3)
通过传入的 FILE *参数找到该文件的描述符、 缓冲区和当前读写位置,
I/O
判断能否从 I/O 缓冲区中读到下一个字符,
如果能读到就直接返回该字符,
否则调用 read(2),
把文件描述符传进去,
让内核读取该文件的数据到 I/O
缓冲区,然后返回下一个字符。注意,对于 C 标准 I/O 库来说,打开的文
件由 FILE *指针标识,而对于内核来说,打开的文件由文件描述符标识,
文件描述符从 open 系统调用获得,在使用 read、write、close 系统调用
时都需要传文件描述符。
fputc(3)
判断该文件的 I/O 缓冲区是否有空间再存放一个字符,
如果有空间则直接
保存在 I/O 缓冲区中并返回,如果 I/O 缓冲区已满就调用 write(2),让内
核把 I/O 缓冲区的内容写回文件。
fclose(3)
如果 I/O 缓冲区中还有数据没写回文件,
就调用 write(2)写回文件,
然后
调用 close(2)关闭文件,释放 FILE 结构体和 I/O 缓冲区。
以写文件为例,C 标准 I/O 库函数(printf(3)、putchar(3)、fputs(3))与系
统调用 write(2)的关系如下图所示。
图 28.1. 库函数与系统调用的层次关系
open、read、write、close 等系统函数称为无缓冲 I/O(Unbuffered I/O)函数,
因为它们位于 C 标准库的 I/O 缓冲区的底层[36]。用户程序在读写文件时既可以
调用 C 标准 I/O 库函数,也可以直接调用底层的 Unbuffered I/O 函数,那么用
哪一组函数好呢?
 
用 Unbuffered I/O 函数每次读写都要进内核,
调一个系统调用比调一个用
户空间的函数要慢很多,所以在用户空间开辟 I/O 缓冲区还是必要的,用
C 标准 I/O 库函数就比较方便,省去了自己管理 I/O 缓冲区的麻烦。
用 C 标准 I/O 库函数要时刻注意 I/O 缓冲区和实际文件有可能不一致,
必要时需调用 fflush(3)。
我们知道 UNIX 的传统是 Everything is a file,I/O 函数不仅用于读写常规
文件,也用于读写设备,比如终端或网络设备。在读写设备时通常是不希
望有缓冲的,
例如向代表网络设备的文件写数据就是希望数据通过网络设
备发送出去,
而不希望只写到缓冲区里就算完事儿了,当网络设备接收到
数据时应用程序也希望第一时间被通知到,所以网络编程通常直接调用
Unbuffered I/O 函数。
C 标准库函数是 C 标准的一部分,而 Unbuffered I/O 函数是 UNIX 标准的一部
分,在所有支持 C 语言的平台上应该都可以用 C 标准库函数(除了有些平台的
C 编译器没有完全符合 C 标准之外)而只有在 UNIX 平台上才能使用 Unbuffered
,
I/O 函数,所以 C 标准 I/O 库函数在头文件 stdio.h 中声明,而 read、write 等
函数在头文件 unistd.h 中声明。
在支持 C 语言的非 UNIX 操作系统上,
标准 I/O
库的底层可能由另外一组系统函数支持,例如 Windows 系统的底层是 Win32
API,其中读写文件的系统函数是 ReadFile、WriteFile。

阅读(841) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~