第一章 温故知新
- 注释已经含有注释/**/的代码块
#if 0 statements /**/ statements #endif
-
%g打印一个浮点值
-
scanf函数有返回值——成功转换并存储于参数中的值得个数
int num; //scanf失败返回0,成功返回转换的值的个数 if( 1==(scanf("%d", &num)) ) { statements... }
- 三字母词——以??作为开头,如??{ [
- 下方代码对于指针声明并初始化——不是把初始值赋值给*message,而是把字符串常量的第1个字符的地址赋值给message这个指向字符的指针
char *message = "hello_world"; //等同于下方声明 char *message; message = "hello_world";
- 尽量使用复合赋值符: += 等。
- 有符号值的右移位操作符(>)是不可移植的。逻辑移位0填充,算数移位符号位填充。
- ++a的结果是对a值的拷贝,并不是变量本身。所以++a = 10; 是错的。
- 逗号操作符: 如下多个表达式自左向右逐个求值,整个逗号表达式的值为最后expressionN的值。
while(expression1,expression2,...,expressionN){ statements }
-
数组不会对下标值进行有效性检测
-
C并不具备显式的布尔类型,所以用整数来代替。0是假,非0值(包括负数)都为真。不要混用整形和布尔型值。
-
如果p是一个指向char的指针,那么p+1指向下一个char;如果p是一个指向float的指针,p+1指向下一个float。
-
函数若不需要参数,声明如下例子(关键字void提示没有任何参数,而不是代表有一个类型为void的参数):
int func(void);
-
size_t类型是无符号整数。
-
strlen返回值是size_t类型,因此下列表达式中第二条语句将永远为真。操作符(>=)左边的表达式是无符号数,不可能为负:
if( strlen(x) >= strlen(y) ) ... if( strlen(x) - strlen(y) >=0 ) ...
-
strncpy不会默认添加'\0'结尾,因此需要赋值保证以'\0'结尾:
char buffer[BSIZE]; ... strncpy(buffer, name, BSIZE); buffer[BSIZE - 1] = '\0';
-
标准库函数更具移植性:例如大写字母判断,采用isupper()库函数,无论机器使用哪个字符集(EBCDIC),都能顺利运行。
if( ch <= 'Z' && ch >= 'A')... if( isupper(ch) )...
-
...