程序与程序设计

程序 = 数据结构 + 算法;数据结构是基础,算法是手段。

需要时刻牢记的程序设计思想:复用。复用包括思想复用、算法复用、代码复用、 二进制复用。目的是不重复做工作,把人解放出来,做更有创新性的事。

程序员守则

每天坚持写程序

主要是些基础的,如字符串操作、链表操作、二分查找、位操作等;

怎样写代码

理清程序逻辑,一气呵成,切忌写一句、调一句;

程序是艺术品

写程序要从严要求,需要精雕细琢,决不能出一行次品;

优化

注意优化程序,主要是减少时间复杂度和空间复杂度;

平时要多问问自己,程序还可以更快吗,运行更快吗?

调试

写好一段程序,先不着急运行,心里先走一遍逻辑,是否有问题;

debug with your brain。不要盲目使用工具跟踪,要看分析代码的逻辑。

C 程序员必备知识

Memory layout and stack

Memory Layout and the Stack

反汇编代码阅读



/*
 * 显式初始化
 * main {
 *   int i = 0;
 * } 的汇编代码
 */
    pushl   %ebp      /* ebp是函数的入口指针,因此要入栈保存,等待函数结束时返回
    movl    %esp, %ebp    /* 将栈顶指针放入ebp,作为基址 */
    pushl   %ecx
    subl    $16, %esp    /* 局部变量i, 在栈中给一个int空间 */
    movl    $0, -8(%ebp)    /* i = 0; 赋初值  */
    addl    $16, %esp    /* 函数返回前自动释放 i */
    popl    %ecx         /* 函数返回 */
    popl    %ebp

/*
 * 不显式初始化
 * main {
 *   int i;
 * } 的汇编代码
 */

    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $16, %esp    /* 只在栈中给一个int 空间,不赋值 */
    addl    $16, %esp
    popl    %ecx
    popl    %ebp


变量是否要初始化

为保险,最好是初始化

宏的使用

宏的作用:增加代码可读性,减少冗长代码。

宏的使用场合

  • 代替常数,增强可读性
  • 代替名字较长的变量,如 struct->content.string,使代码清晰
  • 代替代码段,减少重复输入

使用宏的注意事项

定义宏时要注意加括号,以免宏替换后由于结合性等问题引起错误

const 的使用

  • const 的作用

防止非法修改本不能修改的数据,从而提高开发效率。若不使用 const 很可能造成一些诡异的 bug,而且调试时很难定位。

  • const 的修饰规则

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指 向为常量;

如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。

  • const 的使用场合

修饰变量

修改函数参数

  • const 使用示例

    1 和 2 的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;

    3 为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;

    4 为指针本身和指向的内容均为常量。

在函数 get_glyph_string 中,不能修改指针 str 指向的内存

    int b = 500;
    const int* a = &b; 			1
    int const *a = &b;			2
    int* const a = &b;			3
    const int* const a = &b;	        4

    int* get_glyph_string (const char* str, int len);

简单实用的哈西表

魅力无穷的回调函数

四字节对齐

See Also

  • 微软 360 度
foot bar