程序运行过程中,其值保持不变的量叫常量。
按照所属数据类型分四种常量:
整形常量
实行常量
字符串常量
字符型常量
一、整型常量
•
三种形式:
n
十进制整数:由数字0~9和正负号表示.如 123,-456,0
n
八进制整数:由数字0开头,后跟数字0~7表示.如0123,011
//可能无意中布下陷阱,如case分支用0补齐
n
十六进制整数:由0x开头,后跟0~9,a~f,A~F表示如
0x123,0Xff
二、实型常量
•表示形式(两种):
–十进制数形式:(
必须有小数点
) 如:0.123, .123, 123.0
。
–指数形式:(
e
或
E
之前必须有数字
,
指数必须为整数
)
如
:
12.3
e3 ,123E2, 1.23e4。
错误的写法: e-5 ,1.2E-3.5,e3。
错误的写法: e-5 ,1.2E-3.5,e3。
•实型常量的类型:
–默认为double
型
。
–
在
实型常量后加字母f
或
F,
认为它是
float
型
,如12.3f
实型常量(浮点数)使用注意事项
int i = 0;
if( 0 == i) { printf(
“
OK
”
); }//
整形比较大小
浮点数如何比较大小?
查看以下打印结果
(
完全代码见备注页):
int i= 0;
float
f
= 0.0;
for ( i=0; i<26; i++)
f
+= 0.1;
printf ( "%d,%.7f,%f/n", i,
f
,
f
);
所以浮点数很少是精确的!浮点数比较大小只要是足够接近即可
。
if(
(
f-2.6
)
>-1e-6 &&
(
f-2.6
)
<1e-6
) { printf("OK"); }
//
这里用
if( f == 2.6f)
是不合理的!
正确的方法:
#include <stdio.h>
void main()
{
int i= 0;
float f = 0.0;
for ( i=0; i<26; i++) f+= 0.1f;
printf ( "%d,%.7f,%f/n", i, f ,f);
if( (f-2.6)>-1e-6 && (f-2.6)<1e-6 )
{
printf("ok/n");
}
}
三、字符常量
•
定义:用
单引号
括起来的单个
普通字符
或
转义字符
。
•
•
•
转义字符
:
•
控制字符,表示特殊的动作,不能在屏幕上显示,
反斜线
后面
跟一个字符或一个代码值表示。
•
•
字符常量的值
:一个字符其实是用一个8位整数表示的,故可以
表示256种字符,
表示字符的整数
就是
ASCII
码。
附:常见转义字符
/n
---回车换行
/a---警报
/b---退格
/r---回车不换行,当前位置移到本行行首
//---反斜杠
/’---单引号
/”---双引号
/ddd
---八进制值(d表示一个八进制数字)
如 /101 表示10进制的65
/xhh
---十六进制值(h表示一个十六进制数字)
如 /x41表示10进制的65
上面两个当我们想打印ASCII码对应的字符时可用。
四、字符串常量
字符串常量
定义:用
双引号
(“ ”)括起来的字符序列。
存储:
每个字符串尾
会
自动加一个 ‘/0’
,
作为字符串结束标志
。
例如:字符串“hello”在内存中。
用空格隔开的
连续
的字符串被视为一个串。
例如:查看程序运行结果
void main( )
{
char str[ ] = "Neu" "soft";
printf("%d/n",
sizeof
(str));
printf("%s/n",str);
}
除了按照所属数据类型,常量分为四种,
从表现形式上看常量有下面几种形式:
1.
字面常量-1,3,4,…… ‘a’,’b’,’c’,
“hello”
2.
宏常量-#define PRICE 30
3.
const常量- const int price = 30;
4.
枚举常量—使用enum关键字
使用宏常量的好处:
1.
- 增加程序可读性;
2.
- 减少书写错误;
3.
- 便于维护;
使用const而不是宏来定义常量的好处
:
1、const定义的常量编译器可以对其进行数据类型安全检查,而
#define宏定义的常量却只是进行简单的字符替换,且有时还会
产生边际效应(不如你愿)。
所谓边际效应举例如下:
#define N 100
#define M 200 + N
当程序中使用 M*N 时,原本想要 100 * (200+ N )的却变成了 100 * 200 + N。
#define N 100
#define M 200 + N
当程序中使用 M*N 时,原本想要 100 * (200+ N )的却变成了 100 * 200 + N。
2、有些调试程序可对const进行调试,但不对#define进行调试。
3、当定义局部常量时,const作用域仅限于定义局部常量的函数
体内。但用#define时其作用域不仅限于定义局部常量的函数体
内,而是从定义点到整个程序的结束点。
使用枚举常量
:
注
:
枚举常量一定是整形量
枚举常量不能取地址