常量
常量是在编译就知道的固定值,又称字面量。
字面常量
字面常量又可以细分为整形常量、浮点常量、字符常量,字符串常量。
整形常
在c语言中,十进制表达与平常无异,八进制则需要在数字前加上0,十六进制则需要在数字前加上0x。同时整形常量可以有后缀,u、l。u为unsigned(无符号类型),l为long(长整型)。
10 | 十进制 |
010 | 八进制(此处转化为十进制为8) |
0x10 | 十六进制(此处转化为十进制为16) |
23u | 无符号整数 |
23ul | 无符号长整数 |
书写时除了以上规则还需要注意:
090 | 八进制逢8进一,所以不存在出现8及以上数字的情况,十六进制同理 |
70uu | 不能重复后缀 |
实列:
#include <stdio.h>
int main()
{
int a=13;
long b=24l;
unsigned long c=35ul;//实际上在这里后缀可有可无,因为数据会根据数据类型进行转换。
return 0;
}
浮点常量
浮点常量有两种表现形式,一种是小数,另一种是指数形式。用小数来表达,就必须包含整数、小数点、小数。而指数形式要依靠e来表达(e跟在数字a后,同时e后面也要有一个数字n,意思为a*e的n次方)。
指数形式表达规则:在浮点数的指数形式中,指数可以是正数、负数或零。 当指数为正数时,表示的数值是基数乘以10的指数次方的结果;当指数为负数时,表示的数值是基数除以10的指数次方的结果;当指数为零时,表示的数值等于基数本身。
例:
11.4511 | 用小数表达 |
114511e-5 | 指数形式(114511*10^-5) |
1.14511e1 | 指数形式(1.14511*10^1) |
字符常量
字符常量是指用单引号括起来的字符,该字符可以是普通字符,也可以是转义字符,或者通用字符。
转义字符 | 释义 |
---|---|
\? | 在书写连续多个?时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量‘ |
\" | 用于表达一个字符串内的双引号 |
\\ | 用于表示一个反斜杠,防止其被解释为一个转义序列符 |
\a | 警告符号,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制数字 如:/130表示字符X |
\xdd | dd表示2个十六进制数字 如:/x30表示字符0 |
字符串常量
字符串常量需要用双引号括起来,而字符串的组成可以有普通字符,转义字符,通用字符。
"hello world" | 含普通字符 |
"hello \nworld" | 含普通字符,转义字符 |
const修饰的常变量
const关键字可以作为前缀修饰变量,被修饰的变量称作常变量,他被赋予了常量的属性不可被更改,更准确的说应该是不能被直接更改。
#include<stdio.h>
int main()
{
const int a=10;
//a=20;(错误,被const修饰无法直接更改)
int* p=&a;//可以间接修改
*p=20;
printf("%d\n",a);//此处打印结果为20
return 0;
}
const在修饰指针时会出现两种情况,以int* p为例。若是是const在*的左边,此时const修饰的是*p。若是const在*的右边,那么修饰的是p。如果出现const int* const p,那么就是修饰*p也修饰p,即*p和p都不可直接更改。
注意:a的本质还是变量,不是常量,所以被称作常变量。
#define 定义的标识符常量
使用#define预处理器可以在程序中定义一个常量,它在编译时会被替换为其对应的值。
#define A 100
#include<stdio.h>
int main()
{
printf("%d\n",A);//此处打印结果为100
return 0;
}
枚举常量
枚举是一种创建常量符号的方式,而枚举常量代表该枚举类型的变量可能取的值。(可以理解为每个常量绑定一个名字)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
enum Sex
{
a,//可以为a指定数值,例如a=2,那么b,c依次为3,4
b,
c
};
int main()
{
printf("%d\n", a);//结果为0
printf("%d\n", b);//1
printf("%d\n", c);//2
//注:枚举常量的默认是从0开始,依次向下递增1的
return 0;
}
#define定义的常量与const修饰的常量的区别
#define 定义常量是直接进行替换,而const 是通过修饰变量得到常变量。
#define 是直接替换,所以没有数据类型编译器也无法对其进行类型检查,而const 可以,因为const 修饰的常量具有类型信息。
#define 没有作用域限制,他在整个程序都有效,而cconst 有明确的作用域限制,只能在其定义的作用域使用。