重拾C语言---读C和指针一书的收获(1)

不得不大赞这本《C和指针》一书,不愧是2014年最畅销书籍之一,作者很负责,而且,每一页你都可以发现自己需要学习的地方,真心不错,就决定写博客来记录我阅读这本书的收获。

一,注释

  在C中,如果你用/*   */来注释掉一段代码,你不一定能如愿,如果,这段代码内部原先就有注释存在,这样子就会出现问题。

  要从逻辑上删除一段C代码,最好的办法是用#if指令   

  #if 0

     statement

  #endif

  这样子statement就可以有效的从程序中去掉

二,预处理指令

  #include 头文件

  如果你有一些声明需要用于几个不同的源文件,这个技巧也是一个简便的方法----你在一个单独的文件中编写这些声明,然后用#include指令把这个文件包含到需要使用这些声明的源文件中,避免了复制。

  int read_column_numbers(int column[] , int max);

  像这样子的声明叫做函数原型,其中的参数名称并非是必要的。

  void rearrange( char *ouput,char const *input,int columns, int const column[]);

  这个函数里面的参数中,第二个和第四个被声明为const,说明函数将不会修改函数调用者所传递的这个两个参数

  提示:假如这个程序的源代码由几个源文件组成,那么使用该函数的源文件都必须写明该函数的原型,把原型放在头文件中并使用#include指令包含他们,可以避免由于同一个声明的多份拷贝而导致的维护性问题

  个人补充:

  常见extern放在函数的前面成为函数声明的一部分,那么,C语言关键字extern在函数的声明中起什么作用?
  答案与分析:
  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
  extern int f(); 和int f();
  当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。
三:gets函数
  gets函数从标准输入读取一行文本并把它存储于作为参数传递给他的数组里,一行输入由一串字符组成,以一个换行符结尾,gets函数丢弃换行符,并在末尾存储一个nul字节(nul字节是指字节模式全为0的字节,类似于'\0'这样的字符常量),然后gets函数返回一个非nul值,表示该行已经被成功读取,如果不存在输入行,它就返回null值
四:字符串
  C语言不存在string数据类型,但是整个语言中有一个约定:字符串就是一串以nul字节结尾的字符 
五:
  int read_column_numbers(int columns[], int max){...}
  在函数声明的数组参数中,并没有指定数组的长度,这是正确地,因为不论调用函数的程序传递给它的数组参数的长度是多少,这个函数都照收不误,这是一个伟大的特征,允许函数操纵任意长度的一维数组,这个特征的不利的一面是函数无法知道该数组的长度,如果确实需要知道数组的长度,他的值必须作为一个单独的参数传给函数
六:scanf函数
  scanf("%d",&columns[num]) 
  scanf函数接受几个参数,第一个参数时一个格式字符串,用于描述期望的输入类型,剩余几个参数都是变量,用于存储函数所读取的输入数据。
  scanf函数的返回值是函数成功转换并存储与参数中的值的个数
  scanf函数使用所有格式码(除了%c之外)事,输入值之前的空白都会被跳过,值后面的空白表示该值结束,因此,用%s格式码输入字符串时,中间不能包含空白
  如上述例子,scanf函数转换了一个整数之后,它就会返回1这个值
七:数组
  标准并未硬性规定C编译器对数组下标的有效性进行检查,所以,为了避免数组数据溢出破坏后面存储单元中的数据,要人为的进行限制:num < max,保证输入的数组最多只能有max个。
八:puts函数
  puts函数是gets函数的输出版本,它把指定的字符串写到标准输出并在末尾添上一个换行符
  exit(EXIT_FALURE)  是终止程序运行,EXIT_FAILURE这个值被返回给操作系统,提示出现错误
九:分析下面这行代码
  int i;
  .......
  while((i=getchar())!=EOF && i!='\n')
    ;
  getchar函数从标准输入读取一个字符并返回他的值,如果输入中不再存在字符,则返回EOF
  在大多数其他语言中,我们将像下面这个样子写循环
  i = getchar();
  while(i!=EOF && i = '\n')
   i=getchar();
  他将读取一个字符,接下来,如果我们尚未到达文件末尾或者读取的字符并不是换行符,他将继续读取下一个字符
   其实上面两种写法是等价的,C语言运行将赋值操作蕴含于while语句内部,这样就允许程序员消除冗余语句
  i 被声明为整型而不是char的原因是EOF是一个整型值,他的位数比char要多
  对于该语句的最后一点说明是,while语句后面单独的一个分号称为一个空语句
十:strncpy函数
  strncpy函数的前两个参数分别是目标字符串和源字符串地址,第三个参数是指定需要复制的字符数
  字符串最后要加一个Nul字符作为终止符
十一:警告总结
  1.在scanf函数的标量参数前未添加&字符
  2.机械地把printf函数的格式代码照搬与scanf函数
  3.在应该使用&&的地方用了&
  4.误用了=而不是==
十二:编程提示的总结
  1.使用#include指令避免重复声明
  2.使用#define指令给常量值取名
  3.在#include文件中放置函数原型
  4.在使用下标前先检查他们的值
  5.在while或If表达式中蕴含赋值操作
  6.如何编写一个空循环体
  7.始终进行检查,确保数组不越界!!!!
  
 
  
 

posted on 2015-03-03 21:30  玲先霞  阅读(236)  评论(0编辑  收藏  举报

导航