C语言编程需注意的方面(笔记)

一、书写风格
   良好的编程风格是提高程序可靠性非常重要的手段,也是大型项目多人合作开发的技术基础。具体的变成格式每家公司都有规范,但作为一个初学者养成良好的编程风格还是有必要的。
   1、空行的使用
   空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,所以不要舍不得用空行。但空行也不宜太多,一般情况是这样的:
   a、预处理语句后要加空行;
   b、变量声明或函数声明之后加空行;
   c、变量的声明与定义之间尽量加空行;
   d、一个功能段结束之后加空行,如:if、while等语句完毕以后加空行;
   e、程序返回return前加空行。
    2、修饰符的使用
   修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,要靠个人的习惯,本人是将修饰符* 靠近变量定义的,因为靠近数据类型,例如:int*  x; 从语义上讲此写法比较直观,即x是int 类型的指针。但这很容易引起误解,例如:int*  x, y; 此处y容易被误解为指针变量。不益于程序的阅读。
    3、空格和括号的使用也要注意,尽量让程序清晰易读。
   4、程序的注释是不可少的。 
 
二、变量
   1、变量定义的次序
   最好把同类型的定义在一起,最好把长度小的定义在前面,这样可以优化存储器布局,有可能节约空间,特别是在嵌入式系统存储器比较紧张的情况下更是如此。
    2、变量的声明、定义和初始化
   变量声明时赋值可以使程序简洁,很多情况下推荐使用,但有时会给程序带来麻烦,特别是在多文件模块的程序中,所以全局变量尽量先声明后赋值(全局变量只能赋初值一次)。 
    3、变量类型转换
   整型与字符型的转换。
   #include <stdio.h>
   int  main()
   {
        char a='2';
 
        printf("%c/n", a);
        printf("%d/n", a);
        printf("%d/n", (int)a);
   }
   大家可以试试输出什么,所以不要想当然。
   另外浮点型和整型的转换也要注意
   4 、const修饰变量情况:
     const char *p;  //指向常量的指针,内容不可变,但指针可以变。
     char * const p; //指针为常量,不可变,但内容可以变。
 
三、运算符及表达式
   变量的值和表达式的值
   i++和++i的区别:
   i++是运算之后再加1;
   ++i是加1后再运算;
   例(注意区别):
int  main()
{
  int i = 1;
  printf("%d/n", i++); //打印出来的为表达式(i++)的值 1;
}
int  main()
{
  int i = 1;
  printf("%d/n",++i); //打印出来的为表达式(++i)的值 2;
}
int  main()
{
  int i = 1;
  i++;
  printf("%d/n",i); //打印出来的为变量i的值 2;
}
int  main()
{
  int i = 1;
  ++i;
  printf("%d/n",i); //打印出来的为变量i的值 2;
}
 
四、循环
    1、循环的退出
   循环的正常退出有四种方式:break、continue、exit、return,注意他们的区别:
   break:完全退出循环;
   continue:退出本次循环,继续下次循环;
   exit:退出整个程序;
   return:在子函数中,退出函数体,在main函数中退出整个程序。
    2、循环的使用
   a、嵌套循环中尽量将循环次数少的循环作为外循环,这样可以减少CPU跨切循环层的次数。
   b、我们通常写循环都是这样的for(i=0; i<n; i++){},但在arm系统中,循环尽量这样写for(i=n; i!=0; i--){},虽然从外面看没有什么差别,但arm中在进行非0数比较时,必须用专门的CMP指令来执行,但与0比较时arm可以直接用条件执行(NE)来判别。
    3、无限循环
   while(1)
   {
   }
   要比
   for(;;)
   {
   }
   好一些。通常用while循环。
 
五、比较语句
   比较语句中,千万要留意无论是float还是double类型的变量都有精度限制所以一定要避免将浮点变量用==或!=与数字比较应该设法转化成>=或<=形式。
  动手试着写出与零比较的if语句。
 
六、函数
 
函数接口的两个要素是参数和返回值,编程过程中经常出现函数功能实现没问题,但就是不能得到正确的值。
  1、函数的声明
  void SetValue(int width, int height); //我们经常使用的格式
  void SetValue(int, int);         //不良的风格,但经常看到
  float GetValue(void);          //良好的风格
  float GetValue();   //不良的风格,我们经常使用
  2、函数的返回值
  C语言中,凡不加类型说明的函数,一律自动按整型处理。经常会被误解为void类型。
  有的函数不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
  函数调用结果的返回可以通过三种方式实现:全局变量,return,指针参数。
  3、函数的功能要单一,不要设计多用途的函数。
  4、注意函数的形参和实参有各自的存储单元。
 
七、指针和数组
  C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在程序运行的过程中保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。
  易出错的地方:
1、
  int * p;
  int q[10];  //声明指针和数组
 
  ++p;       //正确
  ++q;       //错误
  数组名只对应一块内存,不可改变,内容可变;
  指针指向一块内存,可改变。
2、
   free(p);  //释放后p并不等与NULL,只是将其指向的内容free掉了,如果在进行操作会带来不可预料的错误,常用的办法是在此句后面将p=NULL。
3、
  像void fun(char str[10]){};这样以数组作为参数时一定要注意:
  数组的长度是传不过来的这样 void fun(char str[10], int 10){};用一个整型数单独传数组的长度。
  在函数中使用sizeof(str) //=4,因为在参数传递时传的是数组的地址(指针),不在是数组名了。
4、
  int i, *j;
  scanf("%d", &i); //正确
  scanf("%d", j);  //错误,因为指针j为空指针,没有申请空间。
5、
  char str[6] = "hello";
  strlen(str)  //=5,不包括'/0'。
  sizeof(str)  //=6,注意区分。
6、
  char p[] = "hello"; //存在栈空间,函数结束就释放了。
  char *p = "hello";  //为字符串常量,存在于静态存储区。所以试图改变*p的操作都会失败。
7、   
  应当将指针变量用==或!=与NULL比较
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值