当前位置:文档之家› 《21天学通C语言》读书笔记

《21天学通C语言》读书笔记

/* ====================================== ** Copyright (c) 2005 Tsinghua University ** Name: 《21天学通C语言》读书笔记 ** Author: Zou Xin ** ====================================== */* -------------------------------- ** 第 4 天课程 语句、表达式和运算符 ** -------------------------------- *> 要将字面字符串常量放在多行中,必须在换行之前加上反斜杆(\)。

例如:printf("Hello,world!");//Fprintf("Hello,\world!");//T> w * x / ++y + z / y //在编程中,应避免使用这种不确定的表达式* ---------------------------- ** 第 5 天课程 使用函数封装代码 ** ---------------------------- *> 内联函数内联函数通常很短。

编译器将尽可能使内联函数的执行速度最快,这可能通过将函数的代码复制到调用函数中来实现。

由于将在调用函数中执行这种函数的代码,因此称为“内联”。

The inline specifier instructs the compiler to replace function calls with the code of the function body.* ------------------------------ ** 第 6 天课程 基本的程序流程控制 ** ------------------------------ *> for 语句的工作原理for (initial; condition; increment)statement;假 -> for 语句结束执行表达式initial -> 判断condition -〈 〉-> 执行表达式increment真 -> 执行statement语句> 与while语句不同,do...while循环体中的语句至少执行一次* ------------------------ ** 第 7 天课程 信息读写基础 ** ------------------------ *> 要打印一个百分号,必须使用两个百分号%%> puts()函数接受一个字符串参数,显示该参数并自动换行。

而且puts()的开销较printf()小。

> 三字符序列(e.g. "??=" 对应的字符为 "#")* ------------------------ ** 第 8 天课程 使用数值数组 ** ------------------------ *> 对于大多数编译器来说,不能使用const关键字定义的符号常量来指定元素数目:const int MONTHS = 12;int array[MONTHS];/* wrong! */* ---------------- ** 第 9 天课程 指针 ** ---------------- *> 指针变量之间可以进行算术求差运算,即将两个指针相减。

例如下面的表达式告诉你两个元素之间的距离(它们之间的元素数):ptr1 - ptr2;此外,指针变量之间也可以进行比较( !=、==、> 、< 、>= 、<= )。

> 注意事项:不要在赋值语句的左边使用未被初始化的指针变量,这可能会造成严重的后果。

* ------------------------- ** 第 10 天课程 字符和字符串 ** ------------------------- *> 使用完 malloc() 函数分配的内存后,应使用 free() 函数将其返回给系统。

> scanf() 函数的返回值为成功输入的字符串数目* ---------------------------------- ** 第 11 天课程 结构、共用体和TypeDef ** ---------------------------------- *> 如果p_str是指向结构str的指针,则下面的三个表达式是等价的:str.memb(*p_str).membp_str->memb> 与其他数据类型一样,也可以将结构体作为参数传递给函数。

> 为了避免混淆,只允许初始化共用体的第一个成员。

> 可以使用关键字typedef给结构体或共用体类型创建别名。

方法如下例:typedef struct{int x;int y;}coord;coord topleft;coord bottoright;* ----------------------- ** 第 12 天课程 变量作用域 ** ----------------------- *> 如果没有显示地初始化外部变量,那么在定义外部变量时,编译器将把它初始化为0。

> extern关键字指出“该函数使用了一个在其他地方定义的外部变量,其名称是什么,类型是什么。

”> 静态变量只在函数首次被调用时初始化一次,以后调用时,程序知道该变量已被初始化,因此不会再次初始化,而变量仍为前一次退出函数时的值;而对于动态变量,每次函数被调用时,都会被初始化为指定的值。

> 常规外部变量对于其所在文件中的所有函数而言都是可见的,同时其他文件中的函数也可以使用它;而静态外部变量只位于它所在的文件中,且在它的定义之后的函数中可见。

> 寄存器变量(register)关键字register只能用于简单的数值变量,而不能用于数组和结构体。

另外,它也不能用于静态变量和和全局变量。

您不能定义指向寄存器变量的指针。

> 不要在main()函数中声明静态局部变量,因为这样做毫无意义。

> 在局部变量的作用域内,程序将暂时忽略全局变量。

* ----------------------------- ** 第 13 天课程 高级程序流程控制 ** ----------------------------- *> break & continue| ------------------ ||while (...) <----|--||{ | || ... | ||continue;--|--||... ||break; ----|--||... | ||... | || } | || ------------------ | |<-------|> 别忘了必要时在switch语句中使用break语句。

> 死循环指的是如果没有外力的干预,将永远执行下去的循环。

> exit(status);函数终止程序的执行,并将控制权归还给操作系统。

如果status为0(or EXIT_SUCCESS),则表明程序正常终止;如果为1(or EXIT_FAILURE),则表明程序终止时发生了某种错误。

要使用exit()函数,程序必须包含头文件stdlib.h。

> C语言的标准库中包含一个system()函数,它让您能够在一个正在运行的程序中执行操作系统命令。

要使用此函数,程序必须包含头文件stdlib.h。

e.g.system("dir *.bak");* ----------------------------------- ** 第 14 天课程 操纵屏幕、打印机和键盘 ** ----------------------------------- *> 流的概念> 可以根据是否缓冲和回显来将字符输入函数分类:* 有些字符输入函数进行缓冲。

这意味着操作系统把所有的字符保存在一个临时存储空间内,直到用户按下Enter键后,再将它们发送到stdin流。

其他一些不进行缓冲,这意味着每当用户按下一个键后,相应的字符将被立刻发送到stdin流。

* 有些输入函数将每个字符回显到stdout。

有些不回显,而只是将字符发送到stdin,而不是stdout。

由于stdout对应的是屏幕,因此输入将被回显到屏幕上。

例如:getchar()读取stdin流中的下一个字符,它具备缓冲和回显的功能。

而getch()函数读取stdin流中的下一个字符,它不对输入字符进行缓冲,也不回显。

getche()类似于getch(),只是它会将字符回显到stdout。

# ########################################################################### ## 说明:getch()函数并非ANSI标准的一部分,并非在所有的系统中都可以使用它。

使用 ##该函数时应包含头文件<conio.h> ## ########################################################################### #> 当用户按下Enter键后,键盘设备将一个回车发送给stdin。

对输入进行缓冲的字符输入函数会自动把回车转换为换行符,因此程序必须检测字符是否为\n,来确定用户是否按下了Enter键。

不对输入进行缓冲的字符输入函数不进行这种转换,因此回车仍然为\r,因此程序必须检测\r。

> 清楚stdin中多余的字符,以免发生错误的方法:一、在一个单独的函数(例如可以命名为clear_kb())中调用gets();二、使用fflush()函数。

原型:int fflush(FILE *stream);表 1scanf()的转换说明符中使用的类型说明符___________________________________________________________________________________ 类型|参数|含义--------+---------------+---------------------------------------------------------- d|int*|十进制整数--------+---------------+---------------------------------------------------------- i|int*|十进制、八进制(以0开头)或十六进制(以0x或0X开头)整数--------+---------------+---------------------------------------------------------- o|int*|八进制整数(以0打头,也可以不以打头)--------+---------------+---------------------------------------------------------- u|unsigned int*|无符号十进制整数--------+---------------+---------------------------------------------------------- x|int*|十六进制整数(以0x或0X打头,也可以不以它们打头)--------+---------------+---------------------------------------------------------- c|char*|读取一个或多个字符。

相关主题