Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150422
  • 博文数量: 20
  • 博客积分: 1515
  • 博客等级: 上尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-14 10:06
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(4)

2009年(14)

我的朋友

分类: C/C++

2009-05-15 00:22:36

这一章主要讲一些容易引起错误的C语言特性
1。switch相关的
  1)switch语句的一般形式如下:
  switch(表达式){
    case 常量表达式:零条或多条语句
    default:零条或多条语句
    case常量表达式:零条或多条语句
   }
  2) 所有case都是可选的。任何形式的语句都是允许的。所以不容易发现错误。比如把default写成defau1t(字符l写成数字1)。都不会检测出语法错误。但程序则不会按你所希望的去执行
  3)case 后面一定要接常量表达式,所以即使是const限定的变量也是不可以的。如
   const int two =2;
   switch(i){
     case 1 : printf("case 1\n");
     case two : printf("case 2\n");//错误
     case 3 : printf("case 3\n");
     default:
    }
    4)switch 不会在每个case标签后面的语句执行完后自动中止。一旦执行某个case语句。程序将会依次执行后面所有的case,除非遇到break语句。这就是所谓的 "fall through"
   
 2、字符连接特性
   ANSI C引入的一个新特性:相邻的字条串常量被自动合并成一个字符串。这就省掉了过去在书写多行时必须在行未加"\"的写法。它们会在编译时自动合并。除最后一行外。其余每个字符串未尾的"\0"字符会被自动删除.如:
   printf("aaaaaa"
       "bbbbbbbbb\n");
   结果会打印出: aaaaaabbbbbbbbb;
   这个特性可能会出现这样的问题:
   在字符串数组初始化时,如果不小心漏掉了一个逗号,编译器不会发出错误信息,而是把两个字符串合并在一起。如:
   char *string[] ={
    "color monitor",
    "big disk" //这里少了一个逗号
    "Cray",
    "on-line drwing routhines",
    };
    这里本意会有四个元素。但因为少了一个逗号。就只有三个元素了。后面如果引用了第四个元素就会出现错误
  3、关于函数的可见性
  定义C函数时,默认情况下函数的名字是全局可见的。可以在函数名字前加extern关键字。也可以不加,效果是一样的。
    这样容易出的问题就是 如果用户编写和库函数同名的函数。就人取而代之
   
   4)C语言的符合重载
    1)staic 在函数内部。表示此变量的值在各个调用间一直保持延续性
             在函数这一级,表示函数只对本文件可见
    2)extrn 用于函数定义,表示全局可见
             用于变量,表示它在其它地方定义
     等等;
    3)p = N*sizeof*q;
    这句怎么解释呢?正确的应该是 p=N*sizeof(*p)
    因为sizeof是个操作符,这里把指针q指向的内容(即*q)作为操作数,它返回q所指向对象的类型的字节数,当sizeof的操作数是个类型名是,两边必须加上括号,但操作数如果是变量则不必加括号。
    apple = sizeof(int) * p;
    这里应该是(sizeof(int)) * (P)
   
    5)因为优先级容易理解错误的地方
     1).的优先级高于* 那么 *p.f 很容易理解为: (*p).f 正解为 *(p.f)
     2).函数()高于 *        int *pf()    错解: int (*pf)()正解:int *(fp())
     3)算术运算符高于移位运算符 msb<<4+lsb 正解为 msb << (4+lsb)
   4)==和!=高于位操作符  (val & mask != 0) 正解: val & (mask != 0)
阅读(1723) | 评论(1) | 转发(0) |
0

上一篇:关于const

下一篇:分析C语言的声明

给主人留下些什么吧!~~

chinaunix网友2009-05-15 10:24:03

写得很不错