C语言学习----04 常量与变量

对于基本数据类型而言,按其取值是否可以改变可以分为常量和变量两种。在程序执行过程中,其值可以改变的量称为变量。它们可与数据类型结合起来,分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须“先定义,后使用”。

直接常量

直接常量可以直接写在程序中,也称为字面常量(literal constant),如10、3.14、2.72就是直接常量。直接常量的类型由书写形式决定,如10就是整型,而3.14、2.72就是实型。

1.整型常量                                                                                                                                                  整型常量类似于数学中的整数。在C语言中,整型常量有十进制、八进制和十六进制3种表现形式,见表1。即使是整型常量也有长整型和短整型、有符号和无符号之分,不同类型的整型常量的表示形式见表2。

表1 不同进制的整型常量的表示形式
整型常量合法的表示实例不合法的表示实例特点
十进制256,-128,0,+7256.0由0~9的数字序列组成,数字前可带正负号
八进制021,-017,+016(分别代表十进制数17,-15,14)089由数字0开头,后跟0~7的数字序列
十六进制0x12,-0x1F,+0x1E(分别代表十进制数18,-31,30)Ox123由数字0加字母x(大小写均可)开头,后跟0~9、a~f(大小写均可)的数字序列
表2 不同类型的整型常量的表示形式
不同类型的整型常量实例特点
有符号的整型常量10,-20,0默认的int型为有符号整数,因此对int型无须使用signed
无符号的整型常量30u,256u无符号整型常量由常量值后跟U或u来表示,不能表示小于0的数,如-30u是不合法的
长整型常量-18l,1024L长整型常量由常量值后跟l或L来表示
无符号长整型常量30lu无符号长整型常量由常量值后跟LU、Lu、lU或lu来表示

 2.实型常量

       实型(浮点型)常量即数学中的实数。在C语言中,实型常量有十进制小数形式和指数形式两种表示形式,如下表3:

表3 实型常量的表示形式
不同形式的实型常量实例特点
十进制小数形式0.123, -12.34, .98十进制小数形式与人们表示实数的惯用形式相同,是由数字和小数点组成的。注意,必须有小数点,如果没有小数点,则不能作为小数形式的实型数。
指数形式3.45e-2(等价于0.0345)指数形式用于直观地表示绝对值很大或很小的数。在C语言中,由于程序编辑时不能输入上下角标,所以以字母e或E来代表以10为低的指数。其中,e的左面是数值部分(有效数字),可以表示成整数或小数形式,不能省略;e的右面是指数部分,必须是整数形式。

       实型常量有单精度和双精度之分,但无有符号和无符号之分,不同类型的实型常量的表示形式见表4:

不同类型的实型常量实例特点
单精度实型常量1.25F, 1.25e-2f单精度实型常量由常量值后跟F或f来表示
双精度实型常量0.123, -12.35, 98.实型常量隐含按双精度型处理
长双精度实型常量1.25L长双精度实型常量由常量值后跟L或l 来表示

3.字符常量

C语言中的字符常量是用单引号括起来的一个字符。例如,'a'是字符常量,而a则是一个标识符。又如,'8'表示一个字符常量,而8则表示一个整型常量。每个字符都有对应的ASCII码,如小写字母a的ASCI码为97(参见附录C)。把字符放在一个单引号中的做法适用于多数可打印字符,但不适用于某些控制字符(如回车符、换行符等)。因此,C语言中还引入了另外一种特殊形式的字符常量——转义字符。转义字符具有特定的含义,不同于字符的原有意义,故称为“转义字符”。例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,它用于控制输出时的换行。转义字符是一种特殊的字符常量,主要用于表示那些用一般字符不便于表示的控制代码,以反斜杠(1)开头,后跟一个或几个字符。常用的转义字符及其含义见表5。

表5 常用的转义字符

转义字符

含义ASCll码
\b退格(Backspace)008
\f走纸换页,跳到下一页开头012
\n        换行,跳到下一行开头010
\r回车013
\t水平制表,横向跳到下一制表位置(Tap)009
\v垂直制表,竖向跳到下一制表位置011
\\反斜杠(\)092
\'单引号(')039
\"双引号(")034
\?问号(?)077
\ooo八进制数值,1~3位八进制数所代表的字符(o代表一个八进制数字)
\xhh十六进制数值,1或2位十六进制数所代表的字符(h代表一个十六进制数字)

        广义地讲,C语言字符集中的所有字符均可用转义字符表示。例如,常量字母A有3中等效的表示,即'A'、'\101'和'\x41';反斜杠也有3种等效的表示,即'\\'、'\134'和'\x5c'。只要ASCll码值相同,就表示同一个字符。

4.字符串常量

       字符串常量是由一对双引号括起来的一个字符序列。如"Hello"、"123"都是字符串。无论双引号内是否包含字符,包含多少个字符,都代表一个字符串常量。                                                               字符常量只用1个字节存储空间,字符串常量占用的存储空间的字节数等于双引号中所包含的字符个数加1。增加的1个字节用于存放字符'\0'(ASCll的码值为0)。每个字符串常量的末尾有一个结尾符'\0',成为空字符,C语言以该字符作为字符串常量结束的标志。例如,"a"表示的是一个字符串常量,占用2个字节;而'a'表示的是一个字符常量,只占用1个字节,如下图所示:字符串常量"a"和字符常量'a'

宏常量和const常量 

1.宏常量 

宏常量也称符号常量,是指用一个标识符来表示的常量。此时该标识符与此常量是等价的。宏常量定义的一般形式如下:                                                                                                                                              #define  标识符                                                                                                                     定义宏常量可以提高程序的可读性,便于程序的调试和修改。宏常量名要具有一定的意义,便于理解。当程序中要多次使用某一个常量时,可以定义宏常量,这样,当要对该常量值进行修改时,只需对预处理命令中定义的常量值进行修改。                                                                                    使用宏常量具有如下优点:                                                                                                                      (1)意义明确,便于理解。                                                                                                              (2)修改方便,一改全改。

注意:      宏定义中的宏名与字符串之间可有多个空格,但无须加等号,且字符串后只能以换行符终止,一般不加分号结尾。因此,宏定义不是C语言中的语句,而是一种编译预处理。若字符串后加分号,则宏替换时会连同分号一起进行替换,错误的宏定义如下:                                                                      #define  PI=3.14;                                                                                                                这是因为经过宏替换后的语句c=2*PI*r;将被替换成下面的语句,从而产生语法错误。                                    c=2*=3.14;*r;

2.  const常量

       使用宏常量的最大问题是,宏常量没有数据类型。编译器对宏常量不进行类型检查,只进行简单的字符串替换,但字符串替换时极易产生意想不到的错误。而const常量可以声明具有某种数据类型的常量,只要将const类型修饰符放在类型名之前,即可将类型名后的标识符定义为具有该类型的const常量。由于编译器将其存放在只读存储区,不允许在程序中改变其值,因此const常量只能在定义时赋初值。const常量定义的一般形式如下:                                                                                         const 数据类型  标识符=常量;                                                                                           在程序中如果多次出现一个常量值,为了后续维护程序的方便,可以使用宏常量或const常量。如果常量值发生变化,只需要修改宏,而不需要修改程序内部相关代码。

变量     

       变量是在程序运行中其值可以改变的量。一个变量应该有一个名称,并在内存中占据一定的存储单元。该存储单元用于存储变量的值。注意区分变量名和变量值这两个不同的概念。变量名实际是一个符号地址,在对程序进行连接编译时,由系统为每一个变量名分配一个内存地址。程序运行时取变量的值,实际上是通过变量名找到相应的内存地址,从其内存单元中读取数据。                         在使用变量之前必须对其进行定义(为编译器所做的描述)。其优点如下:                                             (1)使用变量时不发生错误。例如,若在声明部分有定义“intteacher:”,而在程序中写成“taecher=30;”,那么在对程序进行编译时会检查出taecher没有定义,产生程序错误。                             (2)为变量指定了类型后,在编译时就可为该变量分配内存。                                                             (3)为变量确定了一种类型后,实际上也就确定了对这个变量所能进行的操作。例如,可以对两个整型变量a、b进行求余操作a%b,而不能对两个实型变量进行求余运算。                     

1. 变量的定义                                                                                                                                              定义一个变量包括以下几个方面:                                                                                                  (1)指定一个标识符,这个标识符称为变量名。                                                                                  (2)变量的数据类型,该类型决定了变量值的类型、表现形式和占用内存空间,以及对该变量能执行的运算。                                                                                                                                           (3)变量的存储类型和变量的作用域。                                                                                                     变量定义的一般形式如下:                                                                                                                   [变量存储类型说明符]数据类型说明符变量名1[,变量名2,...];  

2. 变量的初始化 的同时赋予其与类型一致的初值。                                                       在变量定义中,初始化赋值的一般格式如下。                                                                                        [变量存储类型说明符] 数据类型说明符  变量名1=值1[,变量名2=值2,...];                                除了通过初始化为一个变量赋值外,还可以通过scanf函数为其从键盘输入一个值,或者通过赋值表达式直接赋值。

3. 变量的使用                                                                                                                                              在程序中使用变量,要考虑程序运行的环境和变量的取值范围,当变量的取值超出变量类型所规定的范围时,会出现错误的运算结果。                                                                                               本节只介绍几种基本数据类型变量的运用。                                                                                          (1)整型变量。根据整型数据的分类,整型变量分为基本整型、短整型、长整型、无符号基本整型、无符号短整型、无符号长整型6种。                                                                                              (2)实型变量。实型变量分为单精度实型变量和双精度实型变量,两者的区别在于精度,即有效数字位数。                                                                                                                                     任意两个整数之间都存在无穷个实数,由于存储空间的限制,计算机不能表示所有的值,并且往往只是实际值的近似,因此使用实型变量时,可能有误差。实型变量有效位数越多,则其与实际值就越接近,精确度就越高。                                                                                                                       (3)字符型常量。每个字符型常量被分配1个字节的内存空间 ,可以存放1个字符,即字符型变量的取值是1个字符常量。注意,字符型变量在内存单元中存储的不是字符本身的形状,而是该字符所对应的ASCll码值。因此,C语言中可以把字符型数据作为整型数据进行处理:允许对整型变量赋以字符值,也允许对字符型变量赋以整型值;在输出时,允许把字符型常量按整型形式输出,也允许把整型变量按字符形式输出。但要注意,整型变量为4个字节,字符型变量为1个字节,当把整型变量按字符型变量处理时,只有低8位参与处理 。

类型转换              

       表达式的值除了数值大小不同外,还有数据类型之分。在表达式的计算过程中,不同的数据类型进行混合运算时需要进行类型转换。C语言提供了3种类型转换方式:自动类型转换、强制类型转换和赋值时的类型转换。                 

1.自动类型转换                                                                                                                                           自动类型转换发生在不同数据类型混合运算时。这种类型转换先向其中数据类型长度增加的方向进行类型转换,再进行同类型运算,使整个表达式的类型转换为表达式中数据类型长度最长的运算对象类型。这种转换由编译器自动完成,称为自动类型转换,也称隐式类型转换。转换是向数据长度较长的方向进行,目的是防止计算过程中数据被截断,保证计算结果的精度。转换规则如图所示,其中水平方向上的转换是必须进行的,即所有的float类型数据都要转换成double类型,所有的short类型和char类型都要转换成int型,然后参加相应的运算:水平方向转换后,如果仍有不同类型,则按纵向箭头标识的方向进行转换。

2. 强制类型转换。                                                                                                                                        虽然C语言的隐式类型转换使用起来非常方便,但有时还需要从更大程度上控制类型转换。基于这种原因,C语言提供了强制类型转换,也称显示类型转换,是用强制类型转换运算符将运算对象转换为用户所需要的数据类型。其使用格式如下:                                                                                 (目标类型说明符)(表达式)                                                                                                            例如,设float x=7.5;,则x%3显然不符合要求,因为只能对整型数据进行取余运算,所以需要使用强制类型转换,(int)x%3 即7%3。

3. 赋值时的类型转换

        在赋值运算符中已经提到过,当赋值运算符左右类型不一致时,需要进行类型转换,将右侧的类型转换为左侧的类型。这种转换时系统自动进行的,遵循以下规则:                                                 (1)当实型数据赋值给整型变量时,直接取整,舍弃小数部分。例如,整型变量i,i=5.68,则i的值为5。                                                                                                                                                     (2)当字符型或整型数据赋值给实型变量时,数值不变,但要补足相应的有效位数,将实型数据存储到变量中。                                                                                                                                     (3)当单精度实型数据赋值给双精度实型变量时,数值不变,有效位数扩展到16位,以8个字节存储;当双精度实型数据赋值给单精度实型变量时,只截取前面7位有效数字,以4个字节存储,这时应注意数据是否溢出。                                                                                                                         (4)当字符型数据赋值给整型变量时,将ASCII码值赋给最低的8位,若字符型数据的最高位为0,则其余位全部补0;若字符型数据的最高位为1,则其余位全部补1。                                                   (5)当整型数据赋值给字符型变量时,只截取最低的8位赋给字符型变量。                                         (6)当int或long类型数据赋值给short类型变量时,只截取最低的16位赋给short类型变量:当short类型数据赋值给int或long类型变量时,将数据直接赋给最低的16位,其余位按原short类型数据的最高位扩展,全部补0或全部补1。                                                                                                       (7)unsigned类型数据赋值给长度相同的非unsigned类型变量时,直接传送数据;非unsigned类型数据赋值给长度相同的unsigned类型变量时,和符号位一起作为数值进行数据赋值。       

    无论上述3种类型转换中的哪一种转换方式,都不改变被转换数据原来的类型和数值。在表达式计算过程中,为了满足当前需要,只是对数据进行暂时的转换,生成一个临时的值,并不影响原数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值