C语言中常量的表示_第1页
C语言中常量的表示_第2页
C语言中常量的表示_第3页
C语言中常量的表示_第4页
C语言中常量的表示_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9单元 C语言中常量的表示,数据可以用变量存放,也可以用常量形式表示。常量是程序不可修改的固定值,可以分字面常量和符号常量。 字面常数就是直接书写出来的常数,通常不被单独存储,而是与代码一起存储。 符号常量是将一个常量用一个符号表示。,9.1 字面常量,字面常量也称直接变量,是可以从字面上直接识别的不变量。不同类型的字面常量的表示形式是不同的。,9.1.1 整型字面常量的表示和辨识,1. 书写字面整数常量使用的三种进制 在C语言中,整型常量可以使用十进制数、八进制数、十六进制数等格式书写。,八进制和十六进制整常数举例,2. 整数字面常量类型的确定 遇到一个整型字面常量,如何区分为short、

2、int、long、long long、unsigned呢? (1)默认原则。 (2)后缀字母标识法。,(1)默认原则。按照常数所在的范围,决定其类型。例如,在16位的机器中: 当一个常整数的值在十进制-3276832767(八进制数00 177777、十六制数0 x00 xFFFF)范围内都被看作是int型。 如234、32766、0 177776、0 xFFFE等。 超出上述范围的整常数,被看作长整数long int型(32位)。 如, -32769、32768、0200 000、0 x10000等。,(2)后缀字母标识法。例如 用L或l表示long 类型整数,如-12L(十进制long i

3、nt)、076L(八进制long int)、0 x12l (十六进制long int)。 用LL或ll表示long long int类型整数,如-12LL(十进制long long int)。 用U或u表示unsigned类型,如12345u(十进制unsigned int)、12345UL(十进制unsigned long)。,9.1.2 浮点类型字面常量的表示和辨识,1. 浮点类型字面常量的书写格式 (1)小数分量(定点)形式。即一个浮点类型数由小数点和数字组成。例如3. 14159、0.12345、3.、.123等。 (2)科学记数法(浮点,即指数)形式。把一个浮点类型数的尾数和指数并列

4、写在一排,中间用一个字母E或e分隔,前面部分为尾数,后面的整数为指数。例如19.345用科学记数法可表示为0.19345e+2,0.19345E+2,19345e-3。 P.S. C99增加了用十六进制(以0 x或0X打头)书写浮点常数的规范。,注意: 尾数部分可有小数点,但指数部分一定是一个有符号整数。 尾数部分必须存在。 正号可以省略。 1.23e5、3E-3E-3、1e0.3,2. 浮点类型字面常量的辩识后缀 C语言将浮点类型数据分为float、double和long double三种类型,并且默认的浮点类型数据是double类型的。否则可以使用后缀字母: 用f或F表示float类型,如

5、123.45f 1.2345e+2F。 用l或L表示long double类型,如1234.5l 1.2345E+3L,9.1.3 字符类型常量的表示,字符与字符串,可打印字符,转义字符,字符串常数,1. 可打印字符 可打印字符常量是用一对单撇号括起来的一个字符,如a, A , ? , # 注意: 单撇号只是字符与其他部分的分隔符,或者说是字符常量的定界符,不是字符常量的一部分。 不能用双引号代替撇号,如a不是字符常量。 撇号中的字符不能是单撇号或反斜杠,如 或不合法。 字符类型的数据(如字符a, A , ? , 3)在内存中以相应的ASCII代码存放。例如,a的ASCII码为97,则在内存中

6、的二进制存储形式为01100001。 空字符的表示为两个但撇号之间留一空格,不能写明两个靠在一起的单撇号。,在C语言中,字符数据可以等价为与其相应的ASCII码的整数(如a与整数97等价)。 字符数据可以用数值形式输出。反之一个与字符相对应的整数也可以用字符形式输出。字符数据还可以作为整数参加运算,例如A +32,相当于65+32,得到97。,代码9-1 #include int main(void) char ch;/* 定义一个字符类型的变量ch */ ch = a; printf (%d,ch); return 0; ,运行结果为 97,代码9.2 #include int main(v

7、oid) char ch; int i; ch = A; ch = ch + 32; i = ch; printf (“%d is %cn”,i,ch);/* 注意格式码 */ printf(“%c is %dn”,ch,ch); /* 注意格式码 */ return 0; ,运行结果如下: 97 is a a is 97,说明:字符数据占一个字节(8位),分为signed和unsigned ANSI标准ASCII字符的允许范围为0127,最左一位补0。例如,字符A的ASCII码为65,二进制存储形式为01000001。 但是有些计算机系统(例如IBM),还扩充使用128255的字符。它们多是

8、图形字符。例如字符“”,ASCII码为242,即二进制数11110010(八进制数362),其第一位为1。 标准C无统一规定,有的系统把char型变量隐含指定为unsigned型,即其最左端一位不作为符号位,如果按十进制数形式输出,得到的是十进制数242。 有的系统 (如Turbo C,PDP,VAX-11等)把char型变量隐含指定为signed型,即将其最左端一位作为符号位。如果按字符形式输出,则得到的字符“”,如果按十进制数形式输出得到的是-14。,怎样处理这个最左端的位?,不论按哪种原则处理,用户都可以自己定义所需的类型: signed char c1;/* 定义c1为有符号字符变量

9、*/ unsigned char c2;/* 定义c2为无符号字符变量 */,代码9-3 #include int main(void) char c; c = 0362; printf (“%dn”, c); return 0; ,运行结果: -14,2. 转义字符 转义字符(即反斜杠码)是C语言提供的处理一些特殊字符(包括一些不可打印字符)方法。重要的有如下一些: 用反斜杠开头后面跟一个字母代表一个控制字符(不可打印字符); 用代表字符“”,用代表撇号字符; 用后跟1到3个八进制数代表ASCII码为该八进制数的字符; 用x后跟1到2个十六进制数代表ASCII码为该十六进制数的字符。,说明:

10、这一输出只能在打印机上实现,而不能在显示器上实现。因为显示器在显示后一字符时原来在该位置上的字符消失。,代码9.4 /*打印人民币符号”¥”*/ #include int main(void) printf(“Yb=n”); return 0; ,转义字符除用来形成一个外设控制命令外,还用来输出不能直接从键盘上输入或不能用字符常量书写出的ASCII字符。这时要在反斜杠后跟一个代码值,这个代码值最多用3位八进制码数(不加前缀)或两位十六进制数(以x作前缀)表示。,代码9.5 #include int main(void) char ch; ch=362;/*将八进制数362的ASCII字符赋给c

11、h*/ printf (“%c”,ch); return 0; ,运行可输出: ,3. 字符串常数 字符串以双撇号为定界符,但双撇号并不属于字符串。 字符串中的字符数称为该字符串的长度。 字符串常数在机器内存储时,多占用一个字节来存储“0”,对应的ASCII码为0,其含义为“空操作”。 要特别注意空字符常数与空字符串常数的区别。空字符常数在单撇号中要有一个空格,而空字符串有双撇号中没有空格。,9.2 宏,9.2.1 宏定义,代码9.6 求圆的周长和面积的一个程序。 #include #define PI 3.1415926/* 宏定义*/ #define R 1.0/* 宏定义*/ #defi

12、ne CIRCUM 2.0 * PI * R/* 宏定义,使用了前面定义的R和PI */ #define AREAPI * R * R /* 宏定义,使用了前面定义的R和PI*/ int main (void) printf(“The circum is %f and area is %fn”,CIRCUM,AREA); return 0; ,9.2.2 使用宏应当注意的几点,1. 关于宏名 (1)宏名字不能用引号括起来。如 #define “YES” printf(“YES”); (2)宏名中不能含有空格。例如想用A NAME定义SMISS,写成:#define A NAME SMISS 则

13、实际进行的宏定义是A为宏名字,宏体是NAME SMISS。 (3)C程序员一般都习惯用大写字母定义宏名字。,(4)不能进行宏名的重定义。 (5)不能把宏名当变量名使用,如不能对宏名赋值等。 (6)宏名的作用域是从其定义开始到本源程序文件结束的代码区间。可以使用预处理命令#undef提前结束其作用域。例如 #define PI 3.1415926 /* 定义宏名PI*/ #undef PI/* 宏名PI作用域结束 */ ,2. 关于宏定义 (1)宏定义的基本格式如下。 (2)宏定义不是声明,也不是语句,而是一条编译预处理命令,末尾不能加分号。 (3)宏定义可以写在源程序中的任何地方,但必须写在函

14、数之外,通常写在一个文件之首。对多个文件可以共用的宏定义,可以集中起来构成一个单独的头文件。,#define 宏名 宏体字符串,(4)在#define命令中,宏名字与字符串(宏体)之间用一个或多个空格分隔。这个空格就是宏名与宏体之间的分隔符号。 (5)一行中写不下的宏定义,应在前一行结尾使用一个续行符“”,并且在下一行开始不使用空格。例如 #define AIPHABET ABCDEFGHHIJKLMN OPQRSTUVWXY (6)宏定义可以嵌套。,3. 关于宏替换 (1)不可以替换作为用户标识符中的成分。例如,在代码9-6中,不可以用“R”替换CIRCUM中的R。 (2)不能替换字符串常量

15、中的成分,即当宏名出现在字符串中时,编译器对其不做代换处理。,代码9.7 使用宏定义的圆周长和面积计算 #include #define PI3.1415926 #define R1.0 #define CIRCUM2.0*PI*R #define AREAPI*R*R int main (void) printf(“The CIRCUM is %f and AREA is %fn”,CIRCUM,AREA); return 0. ,运行结果: The CIRCUM is 6.283185 and AREA is 3.141593,9.2.3 带参宏定义,1. 带参宏定义的基本格式,#defi

16、ne 标识符(形参表) 宏体,代码9.8 使用带参数宏定义计算圆周长和面积。 #include #define PI3.1415926 #define CIRCUM(r)2.0*PI*(r) #define AREA(r)PI*(r)*(r) int main (void) double r; printf(“Input a radius:”); scanf(“%lf”, ,运行结果为 Input a radius:1.0 The circum is 6.283185 and area is 3.141593,注意:这时的宏体是一个表示表达式的字符串。正确地书写宏体的方法是将宏体及其各个形参应

17、该用圆括号括起来。 代码9.9 演示4种求平方的宏定义的正确性。 #define SQUARE(x) x*x/(a) #define SQUARE(x) (x*x)/(b) #define SQUARE(x) (x)*(x)/(c) #define SQUARE(x) (x)*(x)/(d),到底哪个对呢?,(1)用表达式a=SQUARE(n+1)测试,这时, a:将替换为a=n+1*n+1 b:将替换为a=(n+1*n+1) c:将替换为a=(n+1)*(n+1) d:将替换为a=(n+1)*(n+1) (2)用表达式a=16/SQUARE(2)对(c)和(d)测试。 c:将替换为a=16/

18、(2)*(2)=32 d:将替换为a=16/(2)*(2)=4,3. 带参宏与函数的比较 时空效率不相同。宏定义时要用宏体去替换宏名,往往使程序体积膨胀,加大了系统的存储开销。但是它不像函数调用要进行参数传递、保存现场、返回等操作,所以时间效率比函数高。 宏虽然可以带有参数,但宏定义过程中不像函数那样要进行参数值的计算、传递及结果返回等操作;宏定义只是简单的字符替换,不进行计算。因而一些过程是不能用宏代替函数的,如递归调用。同时,还可能产生函数调用所没有的副作用。,/* 采用函数计算 */ #include long square (int n) return (n*n); int main

19、(void) int i=1; while (i=5) printf (%ldn, square(i+); return 0; ,/* 采用带参宏计算 */ #include #define SQUARE(n) (n)*(n) int main (void) int i=1; while(i=5) printf (“%ldn”,SQUARE(i+); return 0; ,执行结果: 1 4 9 16 25,代码9.10 采用函数与带参宏计算15平方的比较。,执行结果: 1 9 25,9.3 const修饰符,const是C语言的一个关键字,它可以修饰变量,也可以修饰函数参数、函数返回值,使它

20、们“固化”不可修改,有利于提高程序的可读性。此外,它能提供类型等错误检查(宏名是没有类型的),有利于提高程序的可靠性。,9.3.1 用const“固化”变量,1. const的基本用法 C语言允许程序员使用只读区,使所声明的变量变为不可修改的只读变量,即将变量固化,形成一种符号常量。 格式为: const 数据类型 变量1 = 初始表达式1,变量2=初始表达式2, 例如使用定义 const double pi = 3.14159;后,变量pi的值在程序中就是不可修改的了。这种情况称为变量的“固化”,相当于把变量放到了只读存储器中。,注意:const变量与常量还是有一定区别的。例如,常量一般不占

21、用独立的存储空间,而const变量要占用独立的存储空间;此外,它不能用来初始化数组大小,例如代码 const int n = 5; int an;,2. 在多文件程序中共享一个const定义 方法1:在一个文件中将const变量定义为外部变量,并编写一个具有外部引用声明语句的头文件。 例如:,在文件file1.c中定义一个const外部变量 /*file1.c*/ constdoublepi = 3.14; ,然后定义一个头文件 /*file1.h*/ externconstdoublepi;,其他需要使用这个const变量pi的文件,只要包含文件file1.h就可以共享它,而不会有重复定义的

22、问题,方法2:使用静态外部存储类型。 例如,建立一个头文件 /*constant.h*/ staticconstpi = 3.14;。,凡是需要使用这个const变量的文件,都要包含这个头文件。因为静态变量只定义一次,在编译时,会把其中一个作为定义,其他作为引用性声明。,9.3.2 用const修饰指针,const还可以使用在指针定义中,这时在声明语句中会有如下3种情况: 1个名字指针名。 2种对象指针和指针的递引用。 3个修饰指针名前的数据类型、const和指针操作符*。,1. const保护递引用对象 声明格式: const 数据类型 * 指针名; 数据类型 const * 指针名; 名称

23、:常量指针,即指向常量的指针。 例如: const char *p; char const *p;,p is a pointer to const char,特点。 常量指针指其递引用为常量,但并非指针指向真正的常量,只是强调不能通过该指针修改它所指向的对象。 定义时不需要初始化,并且还可以修改其指向,但不可以把一个const对象的地址赋给一个不是指向const对象的指针。 不能使用void*指针保存const对象地址,必须使用const void*类型保存const对象地址。 可以将变量的地址赋给指向常量指针变量,而常量的地址不能赋给无约束的指针。,代码9.11 用const修饰递引用的影响。 int a = 0,b = 1; const in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论