计算机程序涉及两个基本问题,一个是数据的描述,一个是动作的描述。
程序的主要任务就是对数据的处理。
数据以一定的数据形式存储,存放情况由数据类型决定。
C有4种基本数据类型和4种复杂数据类型。
数据类型概述
为什么引入数据类型的概念呢?因为针对不同的数据类型,计算机采用不同的存储方式并进行不同的处理。
数据对象的复杂程度决定数据类型的丰富程度。
数据类型的丰富程度决定了程序设计语言处理数据的能力。
基本数据类型
整型
Short
Unsigned shrot
Int
Unsigned int
Long
Unsigned long
C语言整形有十进制,八进制和十六进制3种表达形式。
Int a = 16;
Int b = 020;
Int c = ox1;
整型+L为长整型。
实型
C中的实数是数学中实数的子集。
C中实数有十进制和指数两种表达方式。
字符类型
单引号为字符,双引号为字符串。
一般字符,转义字符。
常量
常量和变量是相对的概念。常量值不能改变,变量值能改变。
变量代表一块内存。
变量可以在三个地方定义。
使用#define 标识符 常量数据定义常量。
变量
一般情况下要求每个函数数据独立,但有时候也希望各函数有较多的数据联系,甚至各文件之间共享数据,因此在程序设计中必须重视变量作用域。
变量定义:
变量的定义主要是为变量申请内存空间用。(编译器要管理该变量名字和申请该变量的内存大小)
变量的初始化:
变量的初始化主要为在申请到的内存中赋初值。(编译器要在该变量的内存中初始化初值,为后面使用该变量做准备,否则其内存中的值是随机的。)
变量的声明:
变量的声明是说明该变量已经被定义过,(编译器要在已经定义的表中查找该变量的位置)
变量的作用域
局部变量
形参是局部变量。
局部变量是函数内定义的变量,全局变量是函数外定义的变量。
在模块化程序设计中要求每个模块是独立的,一个模块中对数据的操作不能影响另一个模块的数据,否则一些变量将会失控。因此规定变量的作用域是数据独立的保证。
不同的函数中,变量可以重名。
局部变量和全局变量可以重名,在函数中,重名的全局变量不起作用。
全局变量
在函数外定义,所有函数共享的变量。使用extern关键字定义
外部变量
一个文件可以引用另一个文件的全局变量。引用前使用exterd声明,说明已经定义过此变量,不需要在为之分配内存。(两个文件中的全局变量能重名么?)
全局变量和外部变量本质上是一个东西。
C遵循先定义在引用的原则,如果变量定义在引用之后,那么必须在引用前声明,这一点和函数的引用一样。
全局变量可以加强函数模块之间的数据联系,但是又使函数以来这些变量,因此使函数的独立性降低,不利于程序的模块化。因此尽量不使用全局变量。
定义变量
在定义变量的时候应该考虑变量的数据类型,存储方式,作用域等属性。
C中通过定义自动变量,静态变量,全局变量确定存储方式。
变量的存储方式
变量有一个重要属性就是存储方式,分为静态存储和动态存储两种。静态存储:声明时就分配存储单元,并一直保持不变,知道程序结束。全局变脸就是静态存储方式的变量。动态存储:在程序执行过程中,使用时在分配内存,使用完毕立即释放。典型的是形式参数。可以看出,静态存储的变量是一直存在的,动态存储的变量是时而存在时而消失。
自动变量:
使用auto关键字定义。使用动态存储方式。C规定,函数内没有使用存储类型说明的变量默认为auto。
自动变量的作用域在结构体内(函数或符合语句)。这是因为他的存储方式是动态的。在外部结构中调用的时候早已经释放了。
不同结构体内可以重名。
静态变量:
使用static定义。静态变量使用静态存储方式,但使用静态存储的变量不一定就是静态变量。
静态局部变量:
在函数内定义,声明周期为程序,作用域仍然是函数内。他的意义是第二次调用的时候可以保留上一次的值。
静态全局变量:限制全局变量的作用域为文件。
寄存器变量:
使用register关键字定义。动态变量存到动态内存,静态变量存到静态内存。寄存器变量存到CPU寄存器。不需要访问内存,直接访问寄存器。
只限于字符,整型,指针类型的局部变量。一般仅允许声明两个寄存器变量。
我对于变量的理解:变量是一个有名字的存储单元(有可能是在内存中,也可能是在cpu的寄存器中),可以通过这个名字来访问这片内存的值。可贵的是这片存储单元的值是可以改变的(可擦写的),这样我们就可是使用它完成各种功能。
运算符和表达式
算数运算符和算数表达式
C有5种算数运算符 -,+,*,/(除),%(取模)
%两边必须为整形数据
两个整数相除结果为整,两个数有一个为实型结果为double
字符型和数值型能混合运算,因为在计算机中字符是以一个字节的整形表示的
取负运算符
自增自减运算符
赋值运算符和赋值表达式
逗号运算符和求字节运算符
Sizeof(变量名)
条件运算符
? :
数据类型转换
此处待续
自动转换
赋值转换
强制类型转换