- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
在c语⾔中不可表⽰的字符是什么,C语⾔易错点综合
C语⾔原则:⼀切⼯作⾃⼰负责。
C语⾔哲学:语⾔中的任何部分都不应该通过隐藏的运⾏程序来实现。
1.当执⾏⼀个运算时,如果它的⼀个运算符是有符号的,⽽另⼀个运算符是⽆符号的,那么C语⾔会隐式地将有符号参数强制转换为⽆符号
数,并假设这两个数是⾮负数,来执⾏这个 运算。
例如:if( -1 0u) 这条语句中,由于0被定义成了⽆符号的数,表达式就等价于2^32-1 0,可以看到语句的判断结果就和原来的本意
完全不⼀样了。
2.为什么采⽤下⾯的⽅式定义,⽽不是直接#define int_min -2147483648
#define int_max 2147483647
#define int_min -int_max-1
为什么要特意把32位int的最⼩值常量写成-2147483647-1⽽不是-2147483648是因为编译器遇到-X这样的常量是先获得X的值与类
型,然后再对其取负,⽽对于32位以上机器的所有int类型都容不下2147483648这么⼤,所以会再寻找更合适的数据类型来表⽰,⽽寻
找合适类型这步在不同的C语⾔版本,不同的平台,不同的表⽰格式都有不同的适配顺序,这就导致了如果直接写-2147483648可能会是
unsigned的,可能会是long还可能会是long long型的,故⽤-2147483647-1的形式来消弭此歧义。
int dt1 = ( -2147483648 0),int dt2=( 0x800000000)
这⾥的dt1和dt2都是1,⽆论在何种机器上,这⾥存在⼀个隐式转化,转为int型数据。
3.众所周知,C语⾔中,所有⾮0 的数表⽰为真,0表⽰为假。那么null呢?
例如:
if (null)
printf(nihao);
这⾥的打印不会执⾏。因为,null的ASII值就是0,所以null此处就相当于0。
4.容易混淆的const
const并不能把变量变成常量 !它仅仅表⽰这个符号不能被赋值。但它不能防⽌通过程序的内部(甚⾄是外部)的⽅法来修改这个值。const最
有⽤之处就在⽤它来限定函数的形参,这样该函数将不会修改实参指针所指的数据。
5.switch 语句
标准C语⾔规定⾄少允许⼀条switch语句有257个case标签(为了允许switch满⾜⼀个8bit字符的所有情况,即256种情况,再加上EOF)
在switch语句的左花括号和第⼀个case之间可以增加⼀些变量声明,从⽽进⾏⼀些局部存储的分配。但没有必要为这些变量赋初值,因为
它不会被执⾏,程序从后⾯的case开始执⾏。
所有的case都是可选的,任何形式的语句包括带标签的语句都是允许的。这⾥就会出现⼀些问题,例如:
如果把default打错 了,编译器是不会报错的。
注意:break语句事实上跳出的是最近的那层循环语句或switch语句。
6.字符串的连接
旧风格:
printf(nihao \
fecheng gaoxing \
jiandao ni );
新风格:
printf(“nihao”
fecheng gaoxing
jiandao ni );
即新风格下会⽤⼀连串相邻的字符串常量代替,在编译时⾃动合并。除最后⼀个字符串外,其他字符串末尾的\0’都被⾃动删除。当然,
这种特性⼜可能会引⼊新的问题,例如:
char *p[] = {
color,
big disk,
cray //此处少写⼀个逗号
nimei,
nimhao,//这⾥的逗号存在与否没有什么意义
};
缺少逗号的⼀⾏会和后⾯的字符串合并,导致最后数组的个数⽐预期的少⼀个。
7.C语⾔运算符优先级存在的问题
1) .的优先级⾼于*,“-”操作符⽤于消除这个问题。例如:*p.f。
其实际结果是对p取f偏移,作为指针,然后做解除引⽤的操作,等价于*(p.f)
2)函数()⾼于“*”。int *fp() 实际结果是相当于 int *( fp() )。
3)==和!=⾼于位操作符。如(val mask !=0)等价于 val(mask != 0)
4)==和!=⾼于赋值符。如 c = getchar() !=EOF 等价于 c=(getchar() != EOF)
5)算术运算⾼于移位运算。如 msb 4+lsb 等价于msb
6)逗号的优先级是所有运算符中最低的。
8.与空格有关的Bug
1)“\”字符可⽤于⼀些字符的转义,但如何在“\”和需要转义的字符间留上⼀两个空格就会出现问题。
2)z=y+++x;
这句话根据ANSI C规定的“maxima
文档评论(0)