《C陷阱与缺陷》

《C陷阱与缺陷》: http://download.csdn.net/detail/klcf0220/5312856

 

  • = 不同于 == :=作为赋值运算,==作为比较运算;
  • & 和 | 不同于 && 和 ||:& 和 | 为按位运算符,&& 和 || 为逻辑运算符;
  • 词法分析中的贪心法:每一个符号应该包含尽可能多的字符;
  • 整形常量:如果一个整形常量的第一个字符是数字0,那么该常量将被视作八进制数;
  • 字符和字符串:用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在变压器采用的字符集中的序列值;用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针。

image

练习:a+++++b表示什么含义?

答案: http://www.cnblogs.com/arrow12/archive/2012/03/11/2390745.html

 

  • 运算符的优先级:

  (),[],-> > 单目运算符 > 双目运算符号(算术运算 > 移位运算 > 关系运算 > 逻辑运算) > 三目运算 > 赋值运算 > 逗号运算

image

单目运算符是自右至左的,因此*p++会被编译器解释成*(p++),而不是(*p)++;

以为运算符的优先级比算数运算符要低,但是比关系运算符药膏。

  • 函数调用:C语言要求,在函数调用时即使函数不带参数也应该包括参数列表;因此,如果f是一个函数,f();是一个函数调用语言,而f;却是一个什么也不做的语句,更精确的说f;语句是计算函数f的地址,却并不是调用该函数;
  • C语言允许初始化列表中出现多余的逗号,这样设计的目的是方便代码美化工具的方便;
  • C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来,不过可以仿真出一个多维数组出来,因为数组的元素可以是任何类型的对象;对于一个数组,我们只能确定数组的大小和获得指向该数组下标为0的元素的指针。
  • 空指针并非空字符串:当常数0被转换成指针使用事,这个指针绝对不能被解除引用。

image

  • 分隔函数参数的逗号并非逗号运算符。例如f(x,y)则x与y的求值顺序是未定的,但是f((x,y))的顺序是确定的,并且该函数只有一个参数。

 

  • 练习题:

image

答案:

int *bsearch(int *t,int n,int x)
{
     int low = 0,high = n - 1;
     while(low <= high){
          int mid = (high + low) / 2;
          if(x < t[mid])
               high = mid-1;
          else if(x > t[mid])
               low = mid + 1;
          else return t + mid;
     }
     return NULL;
}
 
 

 

  • image
  • image

 

  • %g、%f和%e这3个格式项用于打印浮点值,%g在打印出对应的数值时,会去掉该数值尾缀的零,保留6为有效数字。%E和%G格式项与它们对应的%e和%g格式项在行为方式上基本相同,除了用大写的E代替了小写的e来表示指数形式。%%格式项用于打印出一个%字符。这个格式项的独特之处在于它不需要一个对应的参数。
  • 宏只是对程序的文本起作用,就是说宏提供了一种对组成C程序的字符进行变换的方式,它并不作用于程序中的对象,不能忽视宏定义中的空格。
  • 最好在宏定义中把每个参数都用括号括起来,整个结果表达式也应该用括号括起来,以防止当宏用于一个更大一些的表达式中可能出现的问题。
  • __FILE__ 和 __LINE__ 是内建于C语言预处理器中的宏,他们会扩展为所在文件的文件名和所处代码行的行号。
  • 宏并不是类型定义。对于# difine T1 struct foo * 和 typedef struct foo * T2 ; T1和T2从概念上完全相同,都是指向结构foo的指针。但是,当我们试图用他们声明多个变量时,则会出问题:T1 a , b ; T2 a ,b ; 第一句被扩展为struct foo * a , b ; a被定义为一个指向结构的指针,而b却被定义为一个结构(不是指针)。第二句则不同,它定义了a和b都是指向结构的指针。
  • 移位运算符:

image

image

 

  • ANSI C中定义了一个常数RAND_MAX ,它的值等于随机数的最大取值,在Visual C++中,RAND_MAX的定义为# define RAND_MAX 0x7fff 。
  • ANSI C标准的定义中新增了两个格式码:%p和%n。%p用于以某种形式打印一个指针(或该指针所指向的地址),%n用于指出已经打印的字符数,这个数被存储在对应参数(一个整形指针)所指向的整数中。

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值