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结果 |
---|---|---|---|
gcc | 12 | 100 | 100 |
clang | 14 | 100 | 100 |
从这两段代码看出,用#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中取值。