C学习总结

这里针对日常学习C遇到的问题进行总结,方便日后查看:

 

 1  在C里必须遵循的原则:要使用函数必须先声明。如果没有声明,那么GCC编译器会有默认声明的规则,认为调用的函数返回值为INT,参数为空。然后在后面的函数定义里找匹配的名称的函数,如果找到了发现函数的返回值不一样,会报类似 “隐式声明”问题。但经过测试,如果你调用的函数返回值为INT类型且参数类型也为空,那么你就可以不声明函数。把函数放在MAIN方法后,仍然可以在MAIN方法里进行调用。

 

2   头文件引用问题,

   include<file.h>和include"file.h" 的区别。 

   include<file.h> 只会在系统的包含路径下寻找file.h头文件。

   include"file.h" 则先会在系统当前目录寻找头文件,然后在系统包含路径下寻找头文件。

   系统包含路径是:usr/include  和usr/local/unclude目录。

   但经测试(main方法里调用printf打印函数,不引用stdio.h头文件,运行依然正常)后,一些系统头文件即便不include也不报错。想必这类函数GCC会自动include吧。

 

3   全局变量和局部变量的区别

     全局变量如果不初始化的话,则默认值为0,而局部变量在定义后不进行初始化,其值是不确定的。

      全局变量的初始化必须使用常量表达式,类似这样:int  a  = 5;或int b = 3+4; 如果使用变量表达式,如int a = b/4 ;则会报类似“赋值语句不是常量表达式”的错误。

 

4  在C里,布尔型变量非0即表示TRUE。但 把TURE、FALSE转换成数值型时结果分为1,0

 

5  在C里,用gets函数获取基本输入是危险的,因为gets函数是将屏幕输入的字符串赋值给已经定义好的一个缓冲区(一般为字符数组),当输入的内容大于数组大小时,便会报segment falut 错误。所以尽量避免使用gets 函数。
scanf在从stdin流读取输入时,遇到回车键即 '\n ',则停止, '\n '仍留在输入流中,且忽略空格(遇到空白符如空格、TABLE键等也停止),使用时,如果有多个输入函数被调用,需注意对多余回车的读取,一般使用getchar();
gets接收输入时,不对接收变量进行检查,容易产生内存溢出;
fgets的原形为char   *fgets(char   *string,   int   n,   FILE   *stream);   其中n用于限定string接收数据的上限,多数情况面向文件I/O,说fgets比gets安全,源于溢出检查;

 

6  C99的某一个新特性

C99的新特性也可以做Memberwise Initialization, struct segment s = { .start.x = 1.0, .end.x = 2.0}

 int count[4] = { [2] = 3 };但要注意,只有C语言有memberwise initialization,C++则没有

 

7 数组不能相互赋值或初始化,如:

int a[5] = { 4, 3, 2, 1 };int b[5] = a;

当编译时会报错如下:invalid initializer ,非法的初始化

 

 

8  C99之前不允许在for 循环语句里定义循环标记值,即不允许下面这样:

for (int i=0;i<3;i++) 但C99允许,所以在一般的编译option里可以增加这样的选项:-std=c99

即可以解决问题。

 

9  C里面没有提供获取数组元素个数的函数。不像JAVA,可以通过数组名.length获取数组中元素个数。

可以通过sizeof(数组名)/sizeof(数组名[索引])  获取元素个数。

 

10  再看了一个文章,写一个验证“函数名不是指针”的程序时,发现C++里不加usint namespace std,报错了,恶补下

命名空间的概念,如下:http://www.cppblog.com/Lee7/archive/2008/09/28/62963.html

 

11 关于“函数名不是指针”的讨论很不错的一片文章,记住

http://www.bccn.net/Article/kfyy/cjj/jszl/200602/3702.html

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值