C语言基础知识-第三期-常量

C语言基础知识-第三期-常量,第1张

以本期为第三期,加上之前发布的两篇基础知识讲解,将作为《C语言基础知识》系列进行更新!本期与之前的文风不同,将尝试使用不同的叙述风格进行讲解。


本期关键词:常量


1-常量的定义、种类和使用

定义:与变量类似,但常量用来表示恒常不变的量。


种类:在C语言中一般分为四类,即字面常量、const修饰的常变量、#define宏定义的标识符常量、枚举常量。


它们的用法和形式都大有差别,可以灵活运用以针对各种不同的情况。


以下将对它们进行分别解析。


详细讨论:

(1)字面常量:字面常量是四种形式中格式最简单的,在代码中起到至关重要的作用,在下列代码中,对a和b变量进行最直接的赋值时,所分别赋予的19-21.75、以及后面的wabc就是字面常量,因此可以看出,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;”将会导致程序错误。


以上是本期全部内容。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/577853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存