C语言深度解剖——读书笔记-1、关键字

来源:互联网 发布:s7edge怎么关闭4g网络 编辑:程序博客网 时间:2024/06/10 08:27

0.0 、32个关键字:

auto、short、int、long、char、float、double(6中基本数据类型)、signed、unsigned、struct、union、enum、static、register、const、volatile、typedef、sizeof、extern、return、void、do、while、if、else、for、goto、switch、case、default、break、continue。

注意:define、include这些带#号的都不是关键字,是预处理指令。

关键字意义                      static                  
声明静态变量const声明只读变量volatile
说明变量在程序执行中可被隐含地改变sizeof计算对象所占内存空间大小



0.1、定义与声明

定义    就是(编译器)创建一个对象并为这个对象分配内存,并给它取上一个名字。  如:int  i;

声明    是告诉编译器,在程序中有这么一个对象,但不给它分配内存。 如:extern  int   i;

声明有2重含义:

1.告诉编译器,这个变量名已匹配到一块内存上,下面代码用到的变量或对象是在别的地方定义的。声明可以出现多次;

2.告诉编译器,这个变量名已被预订了,别的地方再也不能用它来作为变量名或对象名。(比如:图书馆的占座,在说面放本书---声明这个座位已有人预订)


1.2  最快的关键字:register

对于register这个关键字定义的变量,不能进行取地址运算(&),因为对于x86架构来说,地址都是在内存中的,不是在寄存器中的,所以对寄存器进行取地址是没有意义的。并且应该注意的是给register定义的变量,应该赋一个比寄存器大小 要小的值。

注意:register只是请求寄存器变量,但是不一定申请成功。


1.3 最名不符实的关键字——static

 对于static有两种用法:
a.修饰变量(其实就是限定变量的作用域):静态全局变量作用域仅限于变量被定义的文件中,其他文件即使使用 extern 声明也无法使用它。准确的说:作用域是从定义之处开始,到文件结束,在定义之处前面的那些代码也不能使用它,除非在前面再加入 extern ***。静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。
对于被static修饰的局部变量总是存在内存的静态存储区的,即使函数结束,这个变量的值也不不会销毁,下次使用仍然会用到这个值。static int i=0;  这是一条初始化语句而不是一条赋值语句  所以跟i=0不一样的。
   b.修饰函数 :是定义为静态函数,此处“static”的含义不是存储方式,而是指对函数的作用域仅局限于本文件(所以用称为内部函数),这样不同文件中的函数名就不怕重名了。原因也是相同的,就是static修饰的一切都是在静态存储区中的。

static 示例代码:i 最后的值为10,j为1。
#include <stdio.h>static int  j;void fun1(void){static int i = 0;i++;printf("%d", i);}void fun2(void){j = 0;j++;}int main(void){int k = 0;for(k = 0; k < 10; k++){fun1();fun2();}printf("%d",  j);return 0;}

1.4 基本数据类型——short、int、long、char、float、double
1、尽量避免名字中出现数字编号,除非逻辑上的确需要编号(变量命名规则)。
2、分为两部分:规范标识符前缀+含义标识(标识符的命名规则)。
3、考虑到习惯性问题,局部变量中可采用通用的命名方式,但仅限于n、i、j等作为循环变量使用。
一般来说习惯上用n、m、i、j、k 等表示int类型的变量;c、ch等表示字符类型变量;a等表示数组;p等表示指针。
4、结构体被定义时必须有明确的结构体名。
5、定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了这块内存,它的值可能是无效的数据。
6、禁止使用八进制数的常数(0除外,因为严格意义上来讲0也是八进制的)和八进制的转移字符。(在计算机中,任何以0开头的 数字都被认为是八进制格式的数,十六进制0x不算。 如:code[0] = 071; 对应十进制57,因为071是以0开头,以八进制形 式存储

1.5 最冤枉的关键字——sizeof

(一)经常被人误认为是函数  

sizeof是关键字不是函数,下面我们利用编译器来证明它的“清白”---验身!看下面例子:

int  i =0

A.  sizeof ( int )  ;   B.sizeof (i)  ;  C.sizeof     int    ;  D.sizeof   i  ;

在32位系统下A、B 的值为:4    ,那么C的值呢? D的值呢?

在32为系统下,通过Visual C ++ 6.0 或任意编译器调试,D的结果为4,没有括号居然也行!而函数名后面没有括号是不行的,所以证明:sizeof 真的不是函数耶!

再看C编译器提示出错,sizeof  int  表示什么?明显不正确,我们可在 int 前加unsigned 、 const等关键字,但不能加sizeof.

【记住:sizeof 在计算变量所占的空间大小时,括号可以省略,如:sizeof i;而计算类型(模子)大小时不能省略:sizeof (int)】 


(二)说明sizeof是关键字不是函数,这里有两个例子:
a. int i; printf("%d\n",sizeof i); 可见 sizeof是关键字
b. sizeof(fun()); 不调用fun函数 因为sizeof是在预编译期间完成的 说明是关键字
sizeof的代码:
#include <stdio.h>    void fun(int b[100])  {      printf("sizeof(b) is %d\n",sizeof(b));                     <span style="font-family: Arial, Helvetica, sans-serif;">  </span>
  int main(void)   {      int *p=NULL;      int a[100];      int b[100];      printf("sizeof(p) is %d\n",sizeof(p));                       4    printf("sizeof(*p) is %d\n",sizeof(*p));                     4     printf("sizeof(a[100]) is %d\n",sizeof(a[100]));             4      printf("sizeof(a) is %d\n",sizeof(a));                       400     printf("sizeof(&a) is %d\n",sizeof(&a));                     4     printf("sizeof(&a[0] is %d\n",sizeof(&a[0]));                4          fun(b);                                                      4     return 1;  } 




0 0
原创粉丝点击