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);
上面两者等效。
任何 C 变量的声明都由两部分组成:类型以及一组类似表达式的声明符(declarator)。
float *g(), (*h)();
表示 *g() 和 (*h) () 是浮点表达式。因为 () 结合优先级高于 * ,*g() 也就是 *(g()):g 是一个函数,该函数的返回值类型为指向浮点数的指针。同理,h 是一个函数指针,h 所指向函数的返回值为浮点类型。
signal 函数是如何声明的呢?