读《LinuxC编程一站式学习》---C基础知识点记录

**程序错误和调试**
编译时错误、运行时错误、逻辑错误和语义错误;
编程和调试:“当你把不可能全部剔除,剩下的——即使看起来再怎么不可能——就一定是事实”。
** 转义序列\和转换说明**
转义序列是在编译时处理的,而转换说明是在运行时调用printf函数处理的。
**初始化**
初始化是一种特殊到声明,而不是一种赋值语句。
**表达式**
任何表达式都有值和类型两种属性;有的表达式既可以做左值也可以做右值,有的只能做右值。
可以做左值的表达式:变量、
a+++++b 编译报错:在编译解析阶段,编译器总是从前到后找到最长到合法Token,((a++)++)+b,表达式a++只能做右值,则(a++)再++编译报错。
**函数**
1.函数调用也是一种表达式,函数调用运算符是一种后缀运算符;
2.C函数有返回值也可以有Side Effect;
3.** main 函数**
       1.查看退出状态:$echo $?($?表示上一条命令的退出状态)
       2.标准形式:int main(int argc ,char *argv[])
          int main(void)亦可
4.函数声明要有完整到函数原型,否则编译器在不知道参数类型和个数的情况下就不会进行语法检查,容易引入bug;每个函数原型都明确规定了返回值类型和参数到类型和个数;
5.写非定义到函数声明时参数可以只写类型而不起名;
**全局变量与局部变量**
1.慎用全局变量,能用函数传参代替的就不要用全局变量;
2.局部变量可以用类型相符的任意表达式初始化,全局变量只能用常量表达式;
3.全局变量定义时不初始化初值为0,局部变量定义时不初始化其值不确定,所以局部变量在使用之前一定先初始化;
**单独使用语句块**
定义一些比函数局部变量更“局部”的变量;
**封装**
把语句封装成函数到基本步骤:把语句放到函数体中,把变量改成函数的参数;
**递归**
递归和循环等价;编写递归时一定记得写Base Case;
**增量式开发**
尽可能复用以前写过到代码;分层设计;
**goto**
goto语句只适用于这种场合,一个函数中任何地方出现了错误条件都可以立即跳转到函数末尾进行出错处理(例如释放先前分配到资源、恢复先前改动过的全局变量),处理完之后函数返回。C++的Exception可以代替goto和setjump/longjump;
**switch**
switch语句块和循环结构到语句块没有本质区别;
Duff's Device利用上述原则实现了一个巧妙到代码优化。
[Duff's Device源码: http://blog.csdn.net/subkiller/article/details/5987944
[维基百科介绍 :http://en.wikipedia.org/wiki/Duff%27s_device
[Duff's Device分析 :http://1025250620.iteye.com/blog/1186780
//参考书目//
布尔代数:《Fundamental of Digital Logic with VHDL Design》[数字逻辑基础]
编译器实现原理:《Compilers:Principles,Techniques&Tools》[Dragon Book]
《Structure and Interpretation of Computer Programs》

你可能感兴趣的:(c,Linxu)