![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言基础-陷阱篇
文章平均质量分 62
ipmux
这个作者很懒,什么都没留下…
展开
-
C陷阱篇之有/无符号数混合时自动类型转换
先看下面代码: void main() { unsigned int i=8; if(i>=-1) printf("8>=-1\n"); else printf("8 } 输出结果是8,明明赋值为8的变量i,结果被程序判定比-1还小,这是怎么回事? 问题根源在于变量i定义中的unsigned。我们都知道原创 2013-12-14 11:00:41 · 1545 阅读 · 2 评论 -
C陷阱篇之移位运算
C语言移位运算有一些不确定性及误区,主要包含两个问题:右移运算的空出位用0还是符号位填充?换句话右移n位与除以2n是否等价? 无符号整数右移,左边空位会用0填充,所以无符号右移n位与除以2n等价。 有符号整数右移,用0还是符号位填充由编译器自行决定,C标准中未定义。当有符号数为正数时,符号位也为0,所以总是用0填充,右移n位与除以2n等价;当有符号数为负,右移后填充原创 2013-12-15 21:38:11 · 2508 阅读 · 0 评论 -
C陷阱篇之运算符优先级
C语言运算符有不同优先级,标准里对这些优先级的规定基本符合人们的正常认知习惯,但其中还有个别容易混淆。其实也不需要死记硬背所有优先级,只要注意几个例外就可以了:“+-”与”>>”运算符 因为和>>某些情况下相当于乘/除2n,很多人总认为它们的优先级也等于乘除而高于加减,但实际上移位运算优先级比加减低。这跟惯常思维不一致,所以当移位加减一起用时一定要注意。比如有人把n*5写成“res=原创 2013-12-15 21:45:22 · 907 阅读 · 0 评论 -
C陷阱篇之enum默认长度
enum型用于定义常量集合,相比#define有一些优势,如:enum是一种数据类型,使用时会检查类型匹配;enum增加了范围约束,避免变量赋值和使用时超出定义范围。但enum也有一个隐含问题:enum变量占用的空间与编译器相关。 多数编译器默认enum型长度等于int型,很多人也把enum型变量等同于int,但C标准在这里留下了尾巴:“枚举型尺寸是能够容纳最大枚举子值的整数尺寸”,“枚原创 2013-12-15 15:05:59 · 21996 阅读 · 2 评论 -
C陷阱篇之define的缺陷
#define存在一些先天不足。在以下情形下要格外小心:避免宏参数中的++与--操作。 带参数的宏定义形式上与函数很接近,程序员调用时有时会把它们视为等价。但实际define定义的伪函数相比真正函数有一些使用限制,比如: #define max(A,B)((A)>(B)?(A):(B)) //看上去是想得到两个数中较大的 void main() {原创 2013-12-15 19:13:57 · 2784 阅读 · 0 评论 -
C陷阱篇之char的默认符号
代码里char c;这样的定义很少有人会留意,可就是这么个简单的定义却有很大的隐患。所有C原始类型中,char比较特殊,其他如long, int, short都默认有符号,相当于signed long, signed int和signed short,只有“char”不确定。某些编译器默认char是有符号的signed char,有些又当作unsigned char处理。例如ARM编译器A原创 2013-12-15 12:18:56 · 7653 阅读 · 1 评论 -
C陷阱篇之复合表达式中的确定与不确定
操作数求值顺序不定 C只规定小部分运算符以已知、特定顺序对其操作数求值,其他运算符的求值顺序没有定义,有偶然性。如a ,C标准规定:先求a,如a成立,再求c并计算整个表达式的值。任何编译器都不会先算c再算a,即&&运算符的求值顺序在C标准中有明确规定,先左后右。但下到a粒度时,C编译器对a和b的分别求值就没有先后规定,各种可能性都有。 C里只规定了四个运算符(&& ||,和?原创 2013-12-16 15:45:56 · 1084 阅读 · 0 评论 -
C陷阱篇之语法正确语义错误的编译器局限
编译器功能只是语法检查,只要语法正确,那它就遵循一个原则:程序员总是对的。其实也只能这样,如果脑子里想着A,实现的却是B,而A/B语法上都成立,那编译器除了认为你正确,还能做什么呢?只能我们自己注意区分A/B相似且语法都成立的下列情况。代码布局与缩进的误导 计算机从不受代码语法和布局影响,而人却易受眼睛影响做出倾向性判断,这些判断有时是错误的。如: for (i=0; i原创 2013-12-16 13:25:52 · 1874 阅读 · 1 评论 -
C陷阱篇之常见手误
C的某些语法容易让人不小心触雷,比如从0开始的下标 很多高级语言中,定义n个元素的数组,下标范围是从1到n,但C特殊,n元素的C数组中没有下标为n的元素,只有从0到n-1的下标。所以使用C数组时不要犯这种错误:int i, a[10];for ( i = 1; i 时超出数组边界八进制or十进制常数 C编译器会把数字025当作八进制,等于十进制的21,因此在使用原创 2013-12-17 11:26:29 · 910 阅读 · 0 评论