C语言的数据类型及其运算符

一、数据类型
(一)、变量与常量
1、变量
(1)、定义:其值在其作用域内可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一一定的存储空间。变量在使用前必须要定义,每个变量都有自己的地址。变量依据其定义的类
型,分为不同类型,如整型变量、字符型变量、浮点型变量、指针型变量等。变量的值可以发生改变,意味着它可以被覆盖、被写入、被赋值。每个变量必须要有一个名字和它所在内存空间绑定。
(2)、变量名和变量值
①、变量名是在变量的声明的时候,该名字就和内存中一块地址绑定在一一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
②、变量的值是变量所对应的内存区域内存放的二进制序列,变量的值不会因为变量的类型发生了改变而改变,当变量被转换为对应类型时,内存区域的二进制序列以该类型的形式翻译出来。这也是强制类型转换能够成立的原因。
(3)、局部变量和全局变量
函数形参变量只有在被调用期间才能分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称为变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。
①局部变量
a、定义:局部变量也称为内部变量,局部变量是在函数内作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
b、关于局部变量的作用域还要说明以下几点。
(a)、主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是-一个函数,它与其他函数是平行关系。这一点是与其他语言不同的,应予以注意。(b)、形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。(c)、允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。例如,在前例中,形参和实参的变量名都为n,是完全允许的。(d)、在复合语句中也可定义变量,其作用域只在复合语句范围内。
②全局变量
全局变量也称为外部变量,它是在函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明,只有在函数内经过说明的全局变量才能使用。全局变量的一说明符为 extern,但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
2、常量
(1)、定义:其值不会发生改变的量称为常量,它们可以和数据类型接合起来分类,如整型常量、浮点型常量,字符常量等。常量是可以不经过定义和初始化,而直接引用的,常量又分为直接常量和符号常量,直接常量又叫作字面常量,如12,0,446,‘a’,"abed”;符号常量,如宏定义的“ #define PI 3.14“常量的值在其作用域内不会发生改变,也不能再被赋值,在其出现时就被当作一个立即数来使用。也就是说,它只能被访问、被读,而不能被写、被赋值。
(二)、基本内置类型
1、基本内置类型有哪些?
(1)整型
整型共有6种:①、带符号整型(int)、②带符号短整型( short int)、③带符号长整型(long int或long)
④无符号长整型( unsigned long)、⑤无符号整型( unsigned int)、⑥无符号短整型( unsigned short int)
(2).实型
实型数据有表示范围和精度两个不同的特征,为了适应数的范围和精度的不同要求,实型数据分三种类型:单精度型(float,也称为浮点型)、双精度型( double)、长双精度型(long double)
(3).构造类型
构造类型是指由若干个相关的数据组合在一起形成的一种复杂数据类型,构造数据类型的成分数据可以是基本数据类型的,也可以是别的构造类型的。按构造方式和构造要求区分,构造类型主要有数组类型、结构类型和共用类型。数组类型是由相同类型的数据组成;结构类型可以由不同类型的数据组成;当不同数据类型不会同时使用时,以节约内存,让不同数据占用同一区域,这就是共用类型。
(4).指针类型
指针类型是取程序对象(如变量)在内存中占据的地址为值的一种特殊的数据类型。
(5).枚举类型
枚举类型来表示。如变量表示一个星期中的某一天,就可用校举类型描述该变量的类型,并以星期几的英文名对日期命名,对应的变量取某日的星期名称为其值。
(6),void类型
用保留字void表示的数据类型有两种完全相反的意思,可以表示没有数据(没有结果没有形式参数),也可以表示某种任意类型的数据(如又与指针结合,用void标起)。void表示空类型,void表示任意类型的指针类型,若使用void类型的数据,应该将它强制的转换成某种具体的指针类型。
(三)、声明与定义
1、什么是定义?
所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊),它们就同内(如函数内、全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个 生共死,终生不离不弃,并且这块内存的位置也不能被改变。一个变量或对象在一定的区域变量或对象。
2、什么是声明?
有两重含义:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了,上面第2行代码用到变
量或对象是在别的地方定义的。声明可以出现多次。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。例如,你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预订,别人再也不允许使用这个座位。其实这个时候你本人并没有坐在这个座位上。这种声明最典型的例子就是函数参数的声明,如“ void fun(int i, char c);”
(四)、static与extern
1、static修饰变量,就是指该变量空间独立于函数中的auto变量或者栈变量,static变量空间在内存中的静态区内分配
2、extern是指当前变量或函数不是在本源文件内声明的,它是外部变量或外部函数,正所谓“外来的和尚会念经”,能很好地体现 extern的价值。当我们在本文件里试图引用一个外部声明的全局变量或函数时,可以在其前面加上 extern,表示它是外来“和尚”
extern可以修饰变量和函数,表示该变量或者函数在其他地方被定义
(五)、const
变量前用const修饰,以为该变量里的数据只可以访问,不能被修改
(六)、auto
意味着当前变量的作用域为当前代码的局部变量,即当前代码会在內栈上进行分配
(七)、register
1、作用
如果一个变量被 register来修辞,就意味着该变量会作为一个寄存器变量,让该变量的访问速度达到最快。例如,一个程序逻辑中有一个很大的循环,循环中有几个变量要频繁进行操作,这些变量可以声明为 register类型。
2.寄存器变量:指一个变量直接引用寄存器,也就航是对变量名的操作的结果是直接对寄存器进行访问。
(1)、注意:①待声明为寄存器变量类型应该是CP寄存器所能接收的类型,意味着寄存器变量是单个变量,变量长度应该小于等于寄存器长度。
②不能对寄存器变量使用取地址符“&”,因为该变量没有内存地址。
③尽量在大量频繁操作时使用寄存器变量,且声明的变量个数应该尽量少
(八)、volatile
它修饰的变量表示该变量的值很容易由于外部因素发生改变,强烈请求编译器要老老实实地在每次对变量进行访问时去内存里读取
(九)、typedef:在编程中使用 typedef目的一般有两个:一个是给变量一个易记且意义明确的新名字,另个是简化一些比较复杂的类型声明
1、typdef与#define的问题:
(1)、在有指针的场合里typdef比#define要好
(2)、①#define宏定义有一个特别的长处:可以使用#idef、#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。
②typedef也有一个特别的长处:它符合范围规则,使用 typedef定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性
2、 typedef与复杂的变量声明
遇到比较复杂的变量声明,使用 typedef作简化自有其价值。
(十)、枚举
1、枚举与# define宏的区别
(1)# define宏常量是在预编译阶段进行简单替换 ,枚举常量则是在编译的时候确定其值。
(2)一般在编译器里,可以调试枚举常量,但是 不能调试宏常量
(3)枚举可以一次定义大量相关的常量,而defi ne宏一次只能定义一个。留两个问题:
(1)枚举能做到事,# define宏能不能都做到? 如果能,那为什么还需要枚举?(2) sizeof( Colorva)的值为多少?为什么?
(十一)、联合体:联合与结构有一些相似之处,但两者有本质上的不同。在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度(同样遵循对齐)。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
1、联合体的定义
union 联合名
{
成员表
};
二、运算符、表达式
(一)C语言的运算符可分为以下几类。
1、算术运算符:用于各类数值运算,包括加(+)、减(-)、乘(
)、除(/)、求余(或称模运算,%)、自增(++)、自减(–),共七种。
2、关系运算:关系运算符:用于比较运算,包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=),共六种。
3、逻辑运算符:用于逻辑运算,包括与(&&)、或(|I)、非(!),共三种
4、位操作运算符:参与运算的量,按二进制位进行运算,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>),共六种。
5、赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=、-=、=、/=、%=、)和复合位运算赋值(&=、|=、^=、>>=、<<=),三类共十一种。
6、条件运算符:这是一个三目运算符,用于条件求值(??。
7、逗号运算符:用于把若干表达式组合成一个表达式(,)。
8、指针运算符:用于取内容(
)和取地址(&)两种运算。
9、求字节数运算符:用于计算数据类型所占的字节数( sizeof)。
10、特殊运算符:有括号()、下标[]、成员(->、.)等几种。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值