第二节:常量的定义

1、const定义常变量

const int a = 10;​​定义整数常变量a=10。此时a的值不能再被改变,但a在编译器看来仍然是个变量——一个不能改变自身值的变量。

有一些事情是不能用常变量做的,如定义数组长度。下述代码会报错。

const int n = 2;	//定义了一个常变量n,其值为2。在此之后,n的值无法被改变
int a[n] = {2,4};	//这行代码会报错,因为n本质上是一个变量,不能用于定义数组

2、#define​定义常量

#define​​定义常量比较简单粗暴。下面举个例子

#define YIBAI 100	//用define定义常量建议字母全部大写
int main(){
	int n = YIBAI;	//直接用100替换YIBAI,简单粗暴
	printf("%d",n);
	return 0;
}

编译后运行结果是显示100。这段代码等价于:

#define YIBAI 100
int main(){
	int n = 100;
	printf("%d",n);
	return 0;
}

有几个比较有意思的代码,我将他们都一一记下。

代码1:

#include<stdio.h>
#define MAX YIBAI
#define YIBAI 100
int main(){
    int n = MAX;
    printf("%d\n",n);
    return 0;
}

代码2:

#include<stdio.h>
#define YIBAI 100
#define MAX YIBAI
int main(){
    int n = MAX;
    printf("%d\n",n);
    return 0;
}

对于以上两段代码,我分别使用gcc和clang进行了编译,并对编译后的文件运行结果做如下表格统计:

编译器版本代码1结果代码2结果
gcc12100100
clang14100100

从这两段代码看出,用#define​​定义常量的时候是可以相互替换的。即n = MAX​​->n = YIBAI​​->n = 100​​。那么下面又有一个有意思的问题来了,如下代码会如何呢?

#include<stdio.h>
#define A B
#define B A
int main(){
    char a = A;
    printf("%c\n",n);
    return 0;
}

1、这个代码的运行结果后面再说。一般写程序也不大可能整出这些花活来。

2、这个代码的char a = A​​的定义其实是会存在问题的,因为对字符型变量进行赋值需要用单引号。

#include<stdio.h>
#define A B
int main(){
    char c='A';
    printf("%c",c);
    return 0;
}

那么这段代码运行的结果会是什么呢?答案是显示的字符是A而不是B。故而define无法替换单引号内的字符(猜测双引号内的也无法替换)。

3、枚举常量

#include<stdio.h>
enum Num{
	ONE = 1,
	TWO = 2,
	THREE = 3
};
int main(){
	enum Num a =THREE;
    char c[a];
    printf("%d\n",a);
	return 0;
}

这段代码是可以通过编译的。

#include<stdio.h>
enum Num{
	A,
	B,
	C
};
int main(){
	printf("%d,",A);
	printf("%d,",B);
	printf("%d\n",C);
	return 0;
}

这段代码的运行结果是0,1,2​​。故如果没有给enum赋初始值,则会按照0,1,2,3……的顺序定义常量。

这里只是简单了解一下枚举常量enum,并不深入学习。

这里只放两个简单的代码来介绍一下以下枚举常量,并不做深入的描述。

代码1:

#include<stdio.h>
enum Num{					//定义枚举常量
	ONE = 1,
	TWO = 2,
	THREE = 3
};
int main(){
	enum Num a =THREE;		//使用枚举常量
    char c[a];
    printf("%d\n",a);
	return 0;
}

该代码能通过编译,且运行结果为在屏幕上显示3。说明a确实是一个常数而非常变量。

代码2:

#include<stdio.h>
enum Num{
	A,
	B,
	C
};
int main(){
	printf("%d,",A);
	printf("%d,",B);
	printf("%d\n",C);
	return 0;
}

该代码运行结果为在屏幕上显示0,1,2​​。这说明,enum在没有赋初始值的情况下,默认按0,1,2,3……这样的顺序赋值。如果只给A=1,那么B和C会自动变成B=2,C=3。

代码3:

#include<stdio.h>
#define Four 4
enum Num{
	ONE = 1,
	TWO = 2,
	THREE = 3
};
int main(){
	enum Num a = FOUR;
    char c[a];
    printf("%d\n",a);
	return 0;
}

这段代码能通过编译,无论是gcc还是clang。而运行结果都是在屏幕上显示4。所以即使用了enum Num a​​也没法限定a只能在enum中取值。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值