购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.6 常量

所谓常量就是程序在运行时不会被修改的量。说得通俗点就是数学中所说的“常数”。在C语言中,基本类型数据分为三类:整数、浮点数和字符,它们实际上都是常量,分别称为整型常量、浮点型常量和字符型常量。

常量很简单。所以本节会夹杂着变量以及后面的一些知识来讲,就当是“热热身”。

5.6.1 整型常量

整型常量就是数学中的整数,如10、35、–33、78。整数可以用十进制、十六进制、二进制或八进制表示。

下面写一个程序:


# include <stdio.h>
int main(void)
{
    int i = 10;
    printf("%d\n", i);
    return 0;
}

变量i定义的是整型,10是整型常量,程序中将整型常量赋给整型变量,合情合理,所以该程序编译、链接、执行都是正确的。

但是如果将10改成10.6会怎么样?原理上是错的,但编译的时候不会报错,只会警告。继续单击链接、执行,这时会发现,虽然程序中写的是10.6,但输出的还是10。这是因为当将一个小数赋给一个整型变量时,程序只会将整数部分赋给整型变量,小数部分会被舍弃。

5.6.2 浮点型常量

浮点型常量又叫浮点数,就是数学中的实数,即带小数点的数。在C语言中浮点数有两种表示方法,一种是传统的写法,如3.1415926;另一种是科学计数法,如2.856e3。e后面的3表示指数,2.856e3就表示2.856×10 3 。e也可以写成大写E,两个是一样的。但需要注意的是,字母e(或E)之前必须要有数字,且e(或E)后面的指数必须为整数,如e36、2.1e3.5等都是不合法的形式。此外,如果你要表示0.01,你可以写成1e-2,千万不要写成1e(-2),不要加括号,直接写就行了。在C编程中,科学计数法的表示方法一般不用,但是你要了解。

下面写一个程序:


# include <stdio.h>
int main(void)
{
    float i = 1e-2;
    printf("i = %f\n", i);
    return 0;
}

编译的时候会产生一个警告:


warning C4305: 'initializing' : truncation from 'const double' to 'float'

为什么会产生警告呢?不管是写成1e-2还是写成0.01都会产生这个警告。这是因为在C语言中,对于所有的实数,不管是用什么形式的写法,传统的写法也好,科学计数法也好,默认的都是double类型的。double型占8字节,而float型占4字节。所以计算机认为将double型数据赋给float型变量会丢失精度,所以它就会产生一个警告。将float改成double警告就消失了。或者改为float i=1e-2F。加F(或f)就表示将这个数当成float来处理。加F(或f)是给float型变量赋值最标准的写法,这种写法在所有编译器中都是能通过的。

但是不管是float还是double,printf中都是%f。可是如果输出浮点数时printf中不小心将%f写成了%d,那结果会怎么样?如果这样的话,那么不管浮点数是多少,输出的都是0。同样,如果输出整数时在printf中不小心将%d写成%f,那么不管整数是多少,输出的都是0.000000。写一个程序看一下:


# include <stdio.h>
int main(void)
{
    float a = 7.5;
    int b = 10;
    printf("a = %d\n", a);
    printf("b = %f\n", b);
    return 0;
}
/*VC++ 6.0中的输出结果是:
--------------------------------------
a = 0
b = 0.000000
--------------------------------------
*/

那么这是为什么呢?这个涉及浮点数在内存中的存储,稍后会介绍整数在内存中的存储。整数和浮点数在内存中的存储方式是不同的。浮点数在内存中的存储方式很复杂,而且一般用不到,所以不讲。对于学习C语言而言,它就属于次要的知识,不需要掌握。上面这个程序是很多初学者经常犯的错误,你们需要知道这么写是错误的。

前面讲到了float和double,它们是什么关系呢?浮点数有两个,一个叫单精度浮点数,用float表示;另一个叫双精度浮点数,用double表示。所谓单精度就是存储的范围小一点、精度低一点;而双精度就是存储的范围大一点、精度更高、更准确一点。同样,因为计算机内存的容量是有限的,所以我们头脑中要有“节约内存”的概念。比如你想存储数字3.3,如果使用float类型的话,只需要4字节,但如果使用double类型的话,就需要8字节。因为4字节完完全全可以将3.3给保存好,所以用float类型比用double类型更合适。

5.6.3 字符型常量

C语言中字符型常量是用单撇号括起来的一个字符,如字母'a'、'b'、'c'、'L'、'M'、'P'……又如符号'?'、'$'、'@'、'>>'……还有一种比较特殊的字符型常量,就是以一个字符'\'开始的字符序列,又叫“转义字符”(见表5-1)。

表5-1 常用转义字符表

字符是相对字符串而言的。字符指的是单个字符,如'A'表示字符A。如果写成'AB'就是错误的。因为'AB'不是单个字符,而是两个字符。字符串指的是多个字符的组合。字符串常量要用双引号括起来,即"AB"。

在C语言中,定义存储字符常量的变量要用char,且输入字符常量时printf中要写%c或%C。这里需要注意的是,不是大写的%C就输出大写,小写的%c就输出小写,这与十六进制的%x和%X不一样。十六进制中大写和小写表示的是一样的,但在字符中,大写字母和小写字母是不同的。

但是在C语言中没有任何一种数据类型可以直接存储字符串,因为字符串不属于数据类型,所以“char i="AB";”是错的。而在C++、Java中可以。在C语言中,字符串是通过字符数组来存储的,这个在后面讲。 GSfUWxpSYwTz95t3gjVIlqfigNJRrUbF1O0WjEJMI0eFhUX78uz5aQ65mfBwse7T

点击中间区域
呼出菜单
上一章
目录
下一章
×