首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C语言关键字

C语言关键字

1.c语言中一共有32个关键字,分别是:auto、int、double、long、char、short、float、unsigned、signed、sizeof、extern、static、goto、if、else、struct、typedef、union、enum、switch、case、break、default、do、while、const、register、volatile、return、void、for、continue。注意:define、include这些带#号的都不是关键字,是预处理指令。
2.定义与声明
定义 是创建一个对象并为止分配内存。 如:int a;
声明 是告诉编译器在程序中有这么一个对象,并没有分配内存。 如: extern int a;
3.对于register这个关键字定义的变量,不能进行取地址运算(&),因为对于x86架构来说,地址都是在内存中的,不是在寄存器中的,所以对寄存器进行取地址是没有意义的。并且应该注意的是给register定义的变量,应该赋一个比寄存器大小 要小的值。注意:register只是请求寄存器变量,但是不一定申请成功。
4.关键字static:=
对于static有两种用法:
a.修饰变量:对于静态全局变量和静态局部变量,都有一个特点就是不能被作用域外面,或外文件调用(即使是使用了extern也没用)。原因就是它是存储在静态存储区中的。对于函数中的静态局部变量还有一个问题,就是它是存在静态存储区的,即使函数结束栈区收回,这个变量的值也不改变。static int i=0; 这是一条初始化语句 而不是一条赋值语句 所以跟i=0不一样的。
b.修饰函数 :是定义为静态函数,使函数只能在文件内部使用,这样不同文件中的函数名就不怕重名了。原因也是相同的,就是static修饰的一切都是在静态存储区中的。
-
static代码如下:
[cpp] view plaincopyprint?

  • #include <stdio.h>
  • #include <stdlib.h>
  • int main(void)
  • {
  • static int j=0;
  • int k;
  • void fun1()
  • {
  • j=0;
  • j++;
  • printf("fun1 %d\n",j);
  • }
  • void fun2()
  • {
  • static int i=0;
  • //i=0;
  • printf("fun2 %d\n",i);
  • i++;
  • }
  • for(k=0;k<10;k++)
  • {
  • fun1();
  • fun2();
  • }
  • return 1;
  • }




5.关键字sizeof:
怎么说明sizeof是关键字不是函数,这里有两个例子:
a. int i; printf("%d\n",sizeof i); 可见 sizeof是关键字
b. sizeof(fun()); 不调用fun函数 因为sizeof是在预编译期间完成的 说明是关键字
sizeof的代码:
[cpp] view plaincopyprint?

  • #include <stdio.h>
  • #include <stdlib.h>
  • void fun(int b[100])
  • {
  • printf("sizeof(b) is %d\n",sizeof(b));
  • }
  • int main(void)
  • {
  • int *p=NULL;
  • int a[100];
  • int b[100];
  • printf("sizeof(p) is %d\n",sizeof(p));
  • printf("sizeof(*p) is %d\n",sizeof(*p));
  • printf("sizeof(a[100]) is %d\n",sizeof(a[100]));
  • printf("sizeof(a) is %d\n",sizeof(a));
  • printf("sizeof(&a) is %d\n",sizeof(&a));
  • printf("sizeof(&a[0] is %d\n",sizeof(&a[0]));
  • fun(b);
  • return 1;
  • }

6.关键字if:
a.对于bool类型的比较:FLASE都是0 TRUE不一定是1 所以应该用if(bool_num); if(!bool_num);

对于浮点型与0比较要是否注意:不能直接比较,要定义精度,其实浮点型与浮点型比较也要注意这个问题,就是不能直接比较,要设定精度,如图:

原因跟浮点型的存储格式有关,因为float的有效位是6位,超出6位就未知了,所以不能直接进行比较。同样的原因,也不能用一个很大的浮点数去加一个很小的浮点数。这个加法可能体现不出来。
b.对于if后面的分号问题 ,一定要注意, 会被解析成if后面有一个空语句, 所以使用空语句的时候最好使用NULL;
c.在使用if else的时候,应该if里面先处理正常情况(出现概率大的情况),else里面处理异常情况,这是一个好习惯看着代码舒服。
7.关键字switch、case:
注意case后面应该是整型或者字符型的常量及常量表达式,case后面最好是应该安装字母或数字顺序排列,先处理正常情况,后处理异常情况。
8.关键字void:
void *的一般用途是, 接收任何类型的指针 ,如当传入函数的指针类型不确定的时候,一般用 void*接收任何类型的指针。
void* 指针作为右值赋值给其他指针的时候一定要强制类型转换,因为void* 指针类型不定。
GNU中void *p p++跟char *p p++是一样的 。
注意:strcpy跟memcpy的区别 就是 strcpy是char * memcpy是void *所以说strcpy是给字符串赋值,memset是给整块内存赋值。
9.关键字extern:
extern就有两种用法:一种是声明外部定义的变量或函数、另一种是extern c告诉编译器以标准c语言方式编译
10.关键字return:
使用return的时候,要注意不能返回栈内指针,因为在函数体结束后,栈是会被收回的,其实是不能期望返回一个指针,来返回一块内存。因为返回一个指针或者地址没有问题,因为return是copy然后返回的,但是那个指针指向的内存如果是在函数栈中的话,就很有可能在函数结束后被收回了!!!
return ; 一般返回的值是1,根据编译器而定。
11.关键字const:
a.const是用来定义只读变量的,切忌它定义的是变量,不是常量,真的常量是#define的和enum。
b.在陈正冲老师的这本书中的第35页,有说编译器不为普通const只读变量分配内存空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高,节省空间。具体的没怎么看懂,本次学习也不打算看懂了(因为它说const修饰的全局只读变量是在静态区的,我太认同)~~~嘿嘿
返回列表