以本期为第三期,加上之前发布的两篇基础知识讲解,将作为《C语言基础知识》系列进行更新!本期与之前的文风不同,将尝试使用不同的叙述风格进行讲解。
本期关键词:常量
1-常量的定义、种类和使用
定义:与变量类似,但常量用来表示恒常不变的量。
种类:在C语言中一般分为四类,即字面常量、const修饰的常变量、#define宏定义的标识符常量、枚举常量。
它们的用法和形式都大有差别,可以灵活运用以针对各种不同的情况。
以下将对它们进行分别解析。
详细讨论:
(1)字面常量:字面常量是四种形式中格式最简单的,在代码中起到至关重要的作用,在下列代码中,对a和b变量进行最直接的赋值时,所分别赋予的19和-21.75、以及后面的w与abc就是字面常量,因此可以看出,C语言中对变量最直接的赋值均是用字面常量进行赋值的。 字面常量写出后是不能被更改的,而且由于其形式简单,在字面上就可以看出是常量 ,因此字面常量有两重含义,一方面它是字面上放置的常量,另一方面则是因为它可以从字面上被看出类型。
其中应当额外注意例子中“30;”这个特殊情况,以“字面常量+分号”这种格式进行书写是被允许的,程序可以正常运行,但是这种写法貌似没有实际用处(截止到2022/4/10,我仍然认为它没有用处)。
int main()
{
int a=19; //整型字面常量
float b=-21.75; //浮点型字面常量
char ch[]='w'; //字符字面常量
char ch[]="abc"; //字符串字面常量
30; //特殊情况
return 0;
}
(2)const修饰的常变量:这一类常变量同时具有常量和变量的性质,它本质上是一个变量,在形式上看也是从变量的定义变化而来,这里我给出两段对比代码来理解这一点。 在图1中,x是一个普通的整型变量,在它进行一次运算之后(x=x+50;),x的值也相应的发生了变化。 而在图2中可以看到,被const修饰后的x不再能进行导致数值变化的运算,它的数值因此不能被改变,这使得它一定程度上损失了变量的性质而更接近一个常量。 它的形式与普通的变量定义类似,由其演化而来,结构为“const+变量类型+变量名=赋值;”。
图1
图2
在以上例子中只能看出这一类常变量的常量性质,实际上它也有变量的属性,我们在图3中给出证明方案。
图3
在图三中可以看到,arr数组的大小在定义的时候必须使用一个常量值,因此整型变量n会导致程序错误,因此我们假设,若const修饰的常变量的本质是一个常量,那么在arr数组的大小定义时,就可以以const修饰的一个常变量作为大小。
图4
在图4中可以看到,即使将变量x以const修饰,仍然被提示说“应输入常量表达式”,这就意味着const修饰的常变量x在这里实际上是一个变量,综合以上考虑我们得出,const修饰的常变量是一个具有常量不可变特点的变量。
(3)define定义的标识符常量:标识符定义的常量在表现形式上与变量名类似不过有两处差异,第一处在于它本质上只是标识符,并没有数据类型,第二是它是在代码最上方宏定义的。 它的格式为“#define+空格+标识符名+空格+标识符值(或字符串、字符)”。
#define Poxia 100
#include
int main()
{
printf("%d\n",Poxia);
return 0;
}
比如在上述例子里,Poxia就是标识符常量的名字,而该程序运行的结果是打印100并换行。
应当注意的是,define定义的标识符常量作用与全局变量有些差异,但是很多情况下非常相似,这将在之后的文章中探讨。
此类常量与const修饰的常变量类似,也不能被施加导致数值变化或字符串、字符改变的运算。
(4)枚举常量:用于列举一些可以一一列出的值,这类常量主要使用枚举类型(枚举关键字:enum)作为载体,结构如下:
#include
enum color
{
RED,
GREEN, //枚举常量
BLUE
};
int main()
{
enum color c=RED;
return 0;
}
在这个例子中,enum color{}的部分并不占用内存,仅仅是将color可能的取值进行罗列并将其视为常量,直到主函数中enum color c时,才向内存中申请空间存放。
这一类常量也不可更改,这就意味着,如果在上述代码中加入“RED=20;”将会导致程序错误。
以上是本期全部内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)