编写C语言的注意事项

看看一些的知识要点及注意事项。


  1、 Switch

  先来看一个简单的实例

  Switch(cmd){

  Case 1:func1();break;

  Case 2:func2();

  Case 3:func3();break

  Default:func();break;

  }

  如果cmd==2,程序执行switch后,会直接转到case 2,执行func2();之后会继续进入case 3,执行func3();遇到break语句之后退出switch,因此如果你本意不想执行func3();一定要在func2();后面加上break。加上default是一个好习惯,default可以放在任何一个位置,后面也要加上break,即使放在最后也要加,以免以后加代码时忘记添加break导致意想不到的错误。

  2、 函数声明

  Char *func(char *,char *);

  Char *func(char *dst,char *src);

  这两个声明都是正确的,但是第二个在原型中加上了参数的名字,更容易让人看懂。

  3、 递归

  通过运行时堆栈支持递归函数的实现,大体流程是这样,递归函数会调用函数本身,每进行一次调用,都将创建一批变量,而把前一次创建的变量压栈,当递归条件不满足时,开始将变量按顺序出栈,直到所有变量被弹出,要注意的是,除非你很有把握,而且确保使用递归函数可大大提高效率,否则不要轻易使用递归,这会使程序的可读性变差,还可能造成意想不到的冗余。

  4、 数组

  数组是相同类型的一组值的集合,int b[4],b[4]内部可存储4个int型数据,那么b的类型是什么?它表示的是整个数组吗?在C中,数组名的值是一个指针常量,指向数组第一个元素,而这个指针常量的类型取决于数组元素的类型,注意这个值是指针常量,而不是指针变量,它的值不能修改,因为如果你修改了这个常量的值,相当于将整个数组移动内存的其它位置,而且在程序运行时,移动数组的行为也是无效的。

  int a[4]; int *c; int b[4];

  C = &a[0];与c=a;执行的任务是一样的,就是把C指向数组的首个元素。

  而b=a;这是非法的,因为a与b均是指针常量,如果想把a的值全部赋给b,需要借助循环来实现。

  a=c;也是非法的,因为a的值也不应该被修改。

  5、 Const

  只要有可能,函数的指针形参都应该声明为const,

  Void strcpy(char *buffer, char const *string);

  这个函数的目的是把string的内容复制到buffer,形参string被声明为一个指向const字符的指针,这样做的好处有3个:

  (1) 读者不必看函数体就知道该数据不会被修改

  (2) 编译器可以捕获任何试图修改该数据的错误

  (3) 这类声明允许向函数传递const参数

  6、 Static

  数组和变量的初始化方式取决于它们的存储类型,存储于静态内存的数组或变量只初始化一次,当程序执行时,静态数组已经初始化完毕,对于自动变量而言,由于自动变量位于运行时堆栈中,执行流每次进入它们所在的代码块,变量所处的内存位置可能不同,如果自动变量的声明中给出了初始值,每次执行流进入变量所在的作用域,变量就被一条隐士的赋值语句初始化,如果是数组元素较多的情况,初始化时间也是比较可观的。

  因此,当数组初始化于一个函数中时,每次调用函数,都会对数组初始化,但若把数组声明为static,数组的初始化只需在程序开始前执行一次。

  7、 效率与

  编写代码不可一味的追求效率,不要写晦涩难懂的程序来彰显自己的语言功底,这只会让程序的变差,如果程序的改进换来的效率并不可观,就不要为了那几十微秒的时间而给后续维护人员带来困惑,它付出的代价是使得程序难于编写在前,难与维护在后,而程序维护是软件产品的主要成本所在,复杂的用法比简单的用法所涉及的风险要大得多。

C语言编程注意事项 1. 每个程序中一定包含main()函数, 尽管C语言中对函数命名没有限制。 2. printf函数永远不会自动换行, 只能用\n来实现, 回车键进行的换行在编译中会出现错误信息。 3. 在vs2008等平台中编译、测试要加 system("pause"); 来暂停dos自动退出引起的printf无法显示。 4. 所有自定义变量必须声明才能使用。 5. 每行一般只一条语句, 在运算符两边加一个空格, 便于阅读。 6. 整数除法将会自动舍位, 不进行四舍五入的操作。 7. for(初始化部分;条件部分;增长部分) 比while 更适用于初始化和增长步长都是单条语句的情况。 8. 使用 #define 名字替换文本对部分"幻数" 赋予意义便于阅读 #define结尾无需;号来结束。 9. EOF(end of file)表示没有字符输入时定义在stdio.h 头文件中 EOF不等于\n 换行等。 10. 由于!= 的优先级大于 = ,因此如果对判断中存在变量赋值时 应对赋值加() 例如: while((c = getchar()) != EOF)。 11. getchar() 用于用户输入直至键入回车键。 12. 变量名以字母和数字组成, (下划线"_"被默认为字符, 以下划线为首字母的为库类变量名), 变量常以小字母开头,内部变量名前31位有效, 外部变量名至少前6位保持唯一性。 13.在C语言中是区分字母大小的。 14. 一个字符常量为一个整数, 用''单引号括起来。例如: '0' 为48, 它与0没有任何关系。 15. ANSI C语言的转义符: \a 响铃符; \b 回退符; \f 换页符; \n 换行符; \r 回车符; \t 横向制表符 ; \v 纵向制表符; \\ 反斜杠; \? 问号; \' 单引号; \" 双引号; \ooo 八进制数; \xhh 十六进制数; '\0' 表示0, 即(null)。 16. 'x'与"x"的区别: 'x'表示一个整数, 字母x在其字符集中对应的数值, "x"表示包含一个字符x 以及一个结束符'\0'。 17. const在声明变量中起限制作用, 该限定变量的值不能被修改。 18. %运算符不能应用于float或double类型。 19. char类型转换为int型时, 因为无法判断它是signed还是unsigned,这样其结果有可能为负数, 所以转换时尽量指定signed和unsigned限制符。 20. ++i与i++ 的不同之处: ++i是先 +1再使用i, i++ 是先使用i再 +1。 21. 三元运算符"?:" 第一个表达式的括号不是必须的, 但是由于三元表达式的优先级非常低, 因此我们还是将第一个表达式用()括起来以便于阅读和理解。 22. C语言中可以使用递归 (即函数调用自身函数), 这样做并不节省储存空间也不加快执行速度, 只是使程序紧凑便于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值