过网而居,点点滴滴

我的IT日记------冲刺流星 isaacct@163.com

IT博客 联系 聚合 管理
  13 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks

1。对(*(void(*)( ))0)( )的解释:
该表达式的功能是在计算机启动时候调用首地址为0 的程序,这是一个函数调用,调用的函数是
(void(*)( ))0.。而它是一个强制转换,意思是“将数值0转换为返回值为void的函数指针”,其中的
void (*)( )说明了这是一个函数指针
2。运算符优先级
优先级带来的困惑实在比较多。最简单的避免混乱的方法莫过于加括号,然而括号太多也会影响阅读。于是一些基本的记忆仍然是必须的
A。运算符优先级大于赋值
很容易犯这样的错误:
while (c=getc(in) != EOF)
       {
         ...
        }
编译器会理解成
while (c=(getc(in) != EOF))
       {
         ...
        }
而与我们预想的结果大不相同
B。基本的优先级顺序
函数运算符 〉单目 〉算术 〉移位 〉关系 〉逻辑 〉赋值 〉条件
比如典型的
 *p++ = *c++不是 (*p)++ = (*c)++ 而是 *(p++) = *(c++)
C。结合性
除了 赋值 ?:是从右向左以外,其他都是从左向右的结合性

3。关于分号 ;
分号的缺失是一个不容易被发现的问题,这是很多语言都具有的特点,尤其是在main( )函数前面定义了某一种数据类型,缺少分号导致它成为main( )函数的返回值,会产生奇怪的错误
*main( )缺省返回值为 int

4.switch
和PASCAL的CASE语句相比较,switch 有所不同,程序流会流过每一种情况,如果忘记加 break,则会产生错误。但是有时候也会带来一些好处,比如
需要在判断的时候计算A+B,那么无论B为正负,让程序流通过B的时候将其反号即可,即
case SUBTRACT
         op2 = -op2;
        /* NO break here!*/
case ...
一定要在注释处醒目标注,否则阅读时不能分辨这里是否应该有 break

5.悬挂 else 问题
这已经是一个古老的问题了,在各种编译器设计中都有自己的处理方法,C 中的处理是 与最近的一个未匹配 else 的 if  匹配 ,但是也可以通过其他的办法,例如宏定义,来消除二义性

posted on 2006-11-06 10:37 冲刺流星 阅读(152) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。