存档

文章标签 ‘代码’

【细节决定成败】switch篇

2012年4月15日  1,795 views 没有评论

前几天在给埃及局点提供补丁时犯了个低级错误,在switch的一个case中忘了写break语句,造成功能在大部分情况下都是正常的,只有个别场景出现了很诡异的问题,通过函数入参日志还看不出任何问题。

由于switch的各case之间肯定是非常相似的,所以这种问题造成的后果不一定能够立即体现出来,因为执行了下一个case中的逻辑后返回的结果很有可能也是正确的。

这种错误是非常低级的,低级到我都不太好意思写在这里了。但是这种错误又感觉很容易发生,这已经不是我第一次犯这种错误了。之前在做PMS插件时也发生过一次,那次也是功能在部分情况下很正常,只在一种很特殊的场景下会有问题。上次也是定位了很久才发现是个如此低级的问题。已经在同一个地方跌倒了两次,那么绝对不能再有第三次……

今天稍微总结了一下犯这种错误的原因,主要分成两个场景:

1、新写一个switch语句,在写完一个case后直接开始逻辑处理,如果这个case下的逻辑比较复杂,很有可能在写完逻辑后就忘了写break语句了。

2、修改原有的switch语句,有时候修改某个case语句,直接把此case下的所有语句都干掉重写,这时候很容易把break语句一起干掉了。然后在写新的逻辑时就很有可能只关注新的逻辑而遗漏了这个break语句。

之前犯错的两次分别就是以上两种场景,说白了就是只关注case下的逻辑而忽略了switch语句的本身。现在我能想到的预防措施就是要向括号配对一样检查case与break的配对情况,每写一个case语句后首先把break加上。

与此类似的还有if else,有时候也会存在if下逻辑复杂,写完后忘记else分支的情况。为预防此种情况,在写完if语句后必须将else语句先写下来,哪怕else下是个空语句。

分类: 心得笔记 标签: , , ,

全局变量、局部变量、静态全局变量、静态局部变量在内存里的区别以及栈与堆的区别

2011年4月26日  15,601 views 5 条评论

全集变量、局部变量、静态全局变量、静态局部变量在内存中如何存储,有什么区别,栈和堆的区别,这都是C/C++的基础问题。在各种招聘笔试面试中,经常都能够遇到与之相关的问题。前些日子我看了一些与之相关的文章,现在总结一下存放于此。

先分析一下四种变量的区别:

 

一、先由程序的内存分配说起,一个完整的C/C++程序在运行时会占用的内存分为几个部分。

  1. 栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  2. 堆(heap) :一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。malloc和new等操作实际上就是在堆中申请内存,对象使用完后要手动释放,否则只能等待程序结束时由系统回收,会产生内存泄漏。
  3. 全局区(静态区)(static):全局变量和静态变量是存储在一起的,初始化过的全局变量和静态变量在同一块区域,未初始化的全局变量和静态变量存放在一块相邻的区域内。此区域由系统在程序结束后释放。
  4. 文字常量区:常量字符串存放于此,在程序结束后由系统释放。字符常量就是像这样的 char* str=”abc”;其中的”abc”。在实际情况中,是会复用的,比如变量a和b都赋值为”abc”则实际上他们指向同一块地址。
  5. 程序代码区:存放函数体的二进制代码。

阅读全文…

老鸟是这样调戏编程新手的~

2011年4月21日  3,776 views 没有评论

在CoolShell上看到一篇有意思的文章(原文链接),是说在comp.lang.c这个C语言新闻组上,
有个网友发了个求助帖,要完成一个课程作业,实现程序输出如下结果。结果被网上的老鸟调戏了……

    *
   ***
  *****
 *******
*********
*********
 *******
  *****
   ***
    *

有个回帖,给出了如下的代码……
阅读全文…

分类: 心得笔记 标签: , , , ,