注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 

日志

 
 

C的缺陷-pitfalls总结(一)  

2014-07-22 22:36:37|  分类: 学习录 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、switch语句中case的"fall through"。

        这是指在case下如果没有使用break语句,编译器解释程序便会默认继续执行下去;还有,在switch语句中,如果把default单词打错了/*比如把字母‘l’打成了数字‘1’*/,编译器是不会报错的,编译会顺利通过,假如你在程序中default语句中写了一条关键性的跳转功能,这有可能很难发现这个小错误。另外一个就是break中断,break语句是跳出语句,没错,但是究竟是跳出到哪里呢?这里摘自一段《C高级编程》中的代码说明。

network code(){

switch(line){

case THING1:

doit1();

break;

case THING2:

if(x == STUFF){

do_first_stuff;

if(y == OTHER_STUFF)

break;    //注意:是这条break语句的跳转

do_later_stuff;

}

initilize_modes_pointer();  //本来意图是跳转到这里

break;

default:

processing();

}

use_modes_pointer();    //结果却跳转到这里继续执行

}

这段代码是美国1990年出现的一次大范围AT&T电话网络瘫痪的故障代码,问题就出在break的跳转上,但C中规定break跳出最近的那层循环语句或switch语句

2、字符串常量的自动合并

        ANSI C中有一个新规定:相邻的字符串常量将被自动合并成一个字符串。在以前的风格中,是在每个字符串常量行末加“\”,并分写为多行。比如:

printf("aaaaa \

bbbbbbb \

ccccccc");

这样在打印的时候会自动忽略掉“\”并使字符串合并在一起,另外,每个字符串末尾的‘\0’也会被自动删除。而现在是:

printf("aaaaa" 

"bbbbbbb" 

"ccccccc");

简便是简便了,可是在字符串数组初始化中也会自动合并,并导致数组元素发生变化,而且不会提示错误。比如:

char *arr[] = {                                                  

"aaaa",

"bbbbb"    //注意:这里遗落了一个逗号,使得和下面字符串合并,最终

      //数组元素个数由43

"ccccc",

"dddddd",    //这个逗号则是加不加都可以的,代表C中预留的元素

};

  评论这张
 
阅读(41)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017