= 不同于 ==

while(c = ' ' || c == '\\t' || c == '\\n')
		c = getc(f);

在比较字符 ‘ ’ 和变量 c 时,误将比较运算符 == 写成了赋值运算符 = 。因为赋值运算符 = 的优先级要低于逻辑运算符 || ,因此实际上是将以下表达式的值赋给了 c:

' ' || c == '\\t' || c == '\\n'

因为 ‘ ’ 不等于零,那么无论变量 c 之前为何值,上述表达式求值的结果都是 1 。

字符与字符串

用单引号(’’)引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。

用双引号引起的字符串,代表的是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为零的字符’\0‘初始化。

printf("Hello World\\n");
char hello[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\\n', 0};
printf(hello);

上面两者等效。

理解函数声明

第13章 高级指针话题

任何 C 变量的声明都由两部分组成:类型以及一组类似表达式的声明符(declarator)。

float *g(), (*h)();

表示 *g() 和 (*h) () 是浮点表达式。因为 () 结合优先级高于 * ,*g() 也就是 *(g()):g 是一个函数,该函数的返回值类型为指向浮点数的指针。同理,h 是一个函数指针,h 所指向函数的返回值为浮点类型。

signal 函数是如何声明的呢?