单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.9 变量与常量

基本数据类型可以作为变量与常量使用,顾名思义,变量运行时可以改变其值,常量运行时不会改变其值。

常量分为整型常量、浮点型常量、字符常量、字符串常量和符号常量。

通常用#define来定义一个标识符来表示一个常量

用type name = 常量来定义一个变量, 变量可以理解成一个容器,可以乘装不同的常量,也可以理解成计算机为name这个标识符开辟的一个个以字节为单位的小格子,小格子的数量就是变量类型type所占据的存储空间。每个小格子里的内容依次是当前所装载的常量数据的字节流

1 整型常量与变量
1)十进制整数

如自然数:

#define CONSTANT_MAX_BUF_LEN_DEC	128
int maxBufLenDec = CONSTANT_MAX_BUF_LEN_DEC;

其中,CONSTANT_MAX_BUF_LEN_DEC为整型常量十进制整数128,maxBufLenDec为变量

2)八进制整数

八进制的数表示为前面带“0”的数。如

#define CONSTANT_MAX_BUF_LEN_OCT	O200
int maxBufLenOct = CONSTANT_MAX_BUF_LEN_OCT;

其中,CONSTANT_MAX_BUF_LEN_OCT为整型常量八进制整数O200,maxBufLenOct为变量

3)十六进制数

与八进制不同,十六进制整数以“0x”开头,如:

#define CONSTANT_MAX_BUF_LEN_HEX	0x80
int maxBufLenHex = CONSTANT_MAX_BUF_LEN_HEX;

其中,CONSTANT_MAX_BUF_LEN_HEX为整型常量十六进制整数0x80,maxBufLenHex为变量

4)二进制数

与八进制不同,二进制整数以“0b”开头,如:

#define CONSTANT_MAX_BUF_LEN_BIN	0b10000000
int maxBufLenBin = CONSTANT_MAX_BUF_LEN_BIN;

其中,CONSTANT_MAX_BUF_LEN_BIN为整型常量二进制整数0b10000000,maxBufLenBin为变量

注意:KEIL编译器C99并不支持二进制整数的表示与输出,使用以上代码编译时会报错:expected a “;”

所以,一般我们并不直接使用二进制数作为常量给变量赋值,而是使用十六进制,如果非要考虑使用二进制位来表示数据,可以考虑使用位域,后期会专门讲解,此处不做展开。

2 浮点型常量与变量

浮点型常量以“f”结尾

#define CONSTANT_PI		3.141592f
float pi = CONSTANT_PI;

其中,CONSTANT_PI为浮点型常量3.141592f,pi为变量

3 字符常量与变量

用单引号界定起来的一个普通字符或转义字符,如: ‘a’、‘A’、‘\n‘、'\t’等。
普通字符可以是字符集中任意一个字符。普通字符常量的值就是该字符的ASCII值。
转义字符是一种特殊的字符常量,以反斜线“\”开头,后跟一个或几个字符,主要用来表示那些无法输出的控制字符或者特殊字符。

转义字符对照表

转义字符意义ASCLL码值(十进制)
\a响铃(BEL)007
\b退格(BS) ,将当前位置移到前一列008
\f换页(FF),将当前位置移到下页开头012
\n换行(LF) ,将当前位置移到下一行开头010
\r回车(CR) ,将当前位置移到本行开头013
\t水平制表(HT) (跳到下一个TAB位置)009
\v垂直制表(VT)011
\’代表一个单引号’039
\"代表一个双引号字符"034
\\代表一个反斜线字符’\’092
?代表一个问号?063
\0空字符(NUL)000
\ddd1到3位八进制数所代表的任意字符三位八进制
\xhh十六进制所代表的任意字符十六进制
#define CONSTANT_ENTER	'\n'
char word = CONSTANT_ENTER;

其中,CONSTANT_ENTER为字符常量’\n’,word为字符变量。

4 字符串常量与变量

用一对双引号括起来的一个字符序列,如:“Hello World”、“Master"、“n”、"$1000”等。
存储:系统自动在字符串常量后面加上“\0”作为字符串结束标志。

#define CONSTANT_HELLO	"Hello World\n"

#define CONSTANT_MASTER	"Master"

char* words = CONSTANT_HELLO;
	
words = CONSTANT_MASTER;		

其中,CONSTANT_HELLO为字符串常量"Hello World\n",CONSTANT_MASTER为字符串常量"Master"。

使用了char* words定义了字符串变量,其本质是一个字符指针。这里相当与将CONSTANT_HELLO及CONSTANT_MASTER的首地址赋值给字符指针words。

5 符号常量

使用**#define宏定义**,前面所述的用标识符替换各常量的表示就是符号常量。

通常将符号常量放在头文件中,然后在源文件函数中调用。

6 变量
1)变量的定义和申明

变量的定义:变量必须经过定义才能使用,变量的定义即为变量开辟内存空间,开辟空间的大小即为变量类型所占的大小。变量的值的范围以变量类型的空间大小和及符号位所决定。同一作用域变量只能定义一次。变量在源文件中定义,永远不要在头文件中定义变量。

int a;		//定义一个整型变量a
float b;	//定义一个浮点型变量b
double c; 	//定义一个双精度型变量c
char d;		//定义一个字符变量d
char* p;	//定义一个字符指针变量p
void test(void)
{
    int sizeOfA = sizeof(a);		
    int sizeOfB = sizeof(b);
    int sizeOfC = sizeof(c);
    int sizeOfD = sizeof(d);
    int sizeOfP = sizeof(p);

    printf("size of a = %d",sizeOfA);		//size of a = 4
    printf("size of b = %d",sizeOfB);		//size of b = 4
    printf("size of c = %d",sizeOfC);		//size of c = 8
    printf("size of d = %d",sizeOfD);		//size of a = 1
    printf("size of p = %d",sizeOfP);		//size of p = 4
}

变量的申明:加上extern关键字的变量即为变量声明,同一作用域变量可声明多次。变量可在源文件中声明,也可在头文件中声明(用作外部变量)

extern int a;		//申明一个整型变量a
extern float b;	//申明一个浮点型变量b
extern double c; 	//申明一个双精度型变量c
extern char d;		//申明一个字符变量d
extern char* p;	//申明一个字符指针变量p
2)变量的初始化

变量定义后,还需要初始化,否则其值会得到预期外的结果。

a = 1024;

b = 0.001024;

c = 0.0000001024;

d = '\n';

p = "Hello World";
3)变量的使用和赋值

变量初始化后,通过直接调用变量可得到变量的值。

printf("a = %d",a);

printf("b = %f",b);

printf("c = %lf",c);

printf("d = %c",d);

printf("p = %s",p);
4)变量的作用范围

变量在哪里定义的,其作用范围就在哪里,如果超出这个作用范围,就会得到变量未定义的错误。作用范围就是{}内部代码块的范围


{

	int i = 0;

}

i += 1;// identifier "i" is undefined


5)全局变量与局部变量

在源文件中函数外定义的变量就是全局变量

在函数中定义的变量就是局部变量。

6)静态变量与动态变量

通过static修饰的变量就是静态变量

静态变量用作全局变量时,它在整个当前源文件都是可见的,而在文件之外是不可见的,在头文件中使用extern声明会得到变量未定义的错误。去掉static修饰,变量用extern就可以访问了。

静态变量用作局部变量时,在程序执行到该变量的定义处时被首次初始化,以后的函数调用不再进行初始化;

动态变量在函数中,每次调用函数都会从初始值开始赋值。


int addTest(int i)
{
	static int sum = 0;
	sum += i;
	return sum;

}

int add(int i)
{
	int sum = addTest(i);
	return sum;
}


void testAdd()
{
	int sum = 0;
	for (int i = 0 ; i < 100 ; i++)
	{
		sum = add(i + 1);
	}
	printf("sum = %d",sum);		//sum = 5050

}


7)常变量

变量用const修饰时,就是常变量

常变量指定义时必须显示初始化且值不可修改的变量。与其他变量一样被分配空间,是可以寻址的。注意,字符串常量是常变量的一种,名称为其本身,因为其存储在静态存储区的常量区,可寻址,不可修改。

常变量和常量的区别是:

常量不开辟内存空间。在预编译时就全部由符号常量的值替换了,⽽常变量占⽤内存空间,只是此变量在存在期间不能重新赋值。

常量在计算机运行时,不会被程序修改的量,常变量是在运行时被计算机赋予的值,其值不是唯一的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值