1.2 运算符实例 a. while (c = getc(in) != EOF) putc(c, out) 循环的意思是复制一个文件到另一个文件。但是由于!=的优先级比赋值运算符的优先级高,所以c被赋予了getc()的返回值与EOF比较后的布尔值,结果向out中写入了一堆1. b. 解释下面几个声明 char *p[]; char (*p)[]; int *fp(); int (*fp)();
char *p[] 常常被错误的理解为指向字符数组的指针。 正确的是p一个数组,里面元素是指向字符的指针类型。 char (*p)[] p是指向指向字符数组的指针。 int *fp() 常常错误理解为函数指针,该函数返回int类型。 正确的是fp是一个函数,他返回一个执行int的指针。 int (*fp)() fp是函数指针,该函数返回int类型。
c. 解释下面的表达式 *p.f; val & mask != 0; max = val1 > val2 ? val1 : val2;
*p.f 对p去f偏移,作为指针,然后进行解引用。相当与*(p.f),因为.的优先级高与*。比较(*p).f。 val & mask != 0 相当与val & (mask != 0). max = val1 > val2 ? val1 : val2 相当与 max = (val1 > val2 ? val1 :val2).
2. 结合性 在标准C语言的文档里,对操作符的结合性并没有作出非常清楚的解释。一个满分的回答是:它是仲裁者,在几个操作符具有相同的优先级时决定先执行哪一个。 看例子: int a, b = 1, c = 2; a = b = c; 这个表达式只有赋值符,这样优先级就无法帮助我们呢决定哪个操作先执行。如果a = b先执行,然后 b = c执行。那么a最终取1。如果b = c先执行, a = b后执行,那么a最终取2。到底哪一个先执行?看结合性,复制的结合性是右至左,所以b = c,然后a = b。 同级的操作符,结合性相同。如果在计算表达式的值时候需要考虑结合性,那么最好把这个表达式一分为二。