常量是在程序运行过程中不能改变值的量,常量的数据类型主要有整型、浮点型、字符型、字符串型。
(1)整型常量
整型常量可以用十进制、八进制和十六进制表示。至于二进制形式,虽然它是计算机中最终的表示方法,但它太长,所以C语言不提供用二进制表达常数的方法。
● 用十进制表示,是最常用也是最直观的。如 7356、−90 等。
● 八进制用数字 0 开头(注意不是字母o),如 010、016 等。
● 十六进制以数字 0+小写字母x或大写字母X开头),如 0x10、0Xf等。
注意:十六进制数只能用合法的十六进制数字表示,字母a、b、c、d、e、f既可以大写,也可以小写。
(2)浮点型常量
浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如 0.888、3345.345、0.0 等。指数表示形式为[±]数字e[±]数字,[]中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如 125e3、7e9、-3.0e-3。
(3)字符型常量
字符型常量是单引号内的字符,如'a','d'等,不可以显示的控制字符,可以在该字符前面加一个反斜杠“\”组成专用转义字符。常用转义字符如表 3-3 所示。
表3-3 常用转义字符表
(4)字符串型常量
字符串型常量由双引号内的字符组成,如'test'、'OK'等。当引号内的没有字符时,为空字符串。在C语言中,系统在每个字符串的最后自动加入一个字符'/0'作为字符串的结束标志。注意字符常量和字符串常量的区别,例如,'Z'是字符常量,在内存中占 1 个字节,而'Z'是字符串常量,占 2 个字节的存储空间,其中 1 个字节用来存放'\0'。
假设要写一个有关圆的计算程序,那么π(3.14159)值会被频繁用到。显然没有理由去改π的值,所以应该将它当成一个常量对待,那么,是否就不得不一遍一遍地写 3.14159 这一长串的数呢?
需要有个偷懒的方法,并且要提倡这种方法,因为多次写 3.14159,难免哪次就写错了。这就用到了宏。宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段。下面只谈其中代替常数值的功能。
宏的语法为
例如,要代替前面说到的π值,应为
有了上面的语句,在程序中凡是要用到 3.14159 的地方都可以使用PAI这个宏来取代。作为一种建议和一种广大程序员共同的习惯,宏名称经常全部使用大写的字母。
常量还可以用const来进行定义,格式为
例如,const float PAI = 3.14159;
const的作用就是指明这个量(PAI)是常量,而非变量。
常量必须一开始就指定一个值,然后,在以后的代码中,不允许改变PAI的值。
用宏定义#define表示的常量和用const定义的常量有没有区别呢?有的,用#define进行宏定义的时候,只是单纯的替换,不会进行任何检查,如类型,语句结构等,即宏定义常量只是纯粹的替换关系,如#define null 0;编译器在遇到null时总是用 0 代替null;而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查,所以,用const定义的常量比较安全。另外,用#define定义的常量,不会分配内存空间,每用到一次,都要替换一次。如果这个常量比较大,而且又多次使用,就会占用很大的程序空间;而const定义的常量是放在一个固定地址上的,每次使用时只调用其地址即可。