1、定义常量
在 C语言中,常量有两种定义方式,分别是使用 #define
和const
。
1)#define(宏定义)
#define <宏名/标识符> <字符串>
2)const
可以使用 const 前缀声明指定类型的常量:
const type variable = value;
例如,
#include <iostream>
using namespace std;
int main(){
//常量方式1
const int a = 18;
cout << "我的年龄是"<< a << endl;
const char nameStr[] = "cjavapy";
const int age = 30;
printf("我叫%s,%d岁\n",nameStr,age);
//常量方式2 修改一次可以改变全局 define本质就是替换
#define X 100 //不能有;
printf("数量%d个\n", X);
cout << "数量" << X*X << "个" << endl;
#define PI 3.1415
int R = 100;
printf("周长=%f,面积=%f\n", 2 * R*PI, PI*R*R);//f是实数
#define name "cjavapy"
cout << "关键字是%s"<< name;
return 0;
}
2、const 与 #define 定义常量的区别
1)const 定义常量
不能直接修改,但是可以间接修改可以通过直接修改内存进行修改可以通过指针进行修改
2)#define 定义常量
不能通过指针进行修改,也不能通过内存进行修改,相当于真正意义的常量。
一个标识符被宏定义后,该标识符便是一个宏名。这时,在程序中出现的是宏名,在该程序被编译前,先将宏名用被定义的字符串替换,这称为宏替换,替换后才进行编译,宏替换是简单的替换。
例如,
#include <iostream>
using namespace std;
#define VAR 10001
int main()
{
const int var = 1001;
cout << var;
*(int *)(&var) = 101;// 转换常量指针为非常量指针,说明 constant 不算真正的常量
cout << endl << var;
cout << VAR;// 不能取地址进行修改
return 0;
}
3、constexpr 常量
使用 constexpr
关键字声明编译期常量,其值在编译时确定。比 const
更严格,要求在编译时确定值,因此适用于优化。常用于编译时确定的常量表达式和数组大小。
#include <iostream>
constexpr int getSquare(int x) {
return x * x;
}
int main() {
constexpr int side = 5;
constexpr int area = getSquare(side); // 编译时计算
std::cout << "Area of square: " << area << "\n";
return 0;
}
4、枚举常量(enum)
枚举(enum
)是一种定义一组整数常量的方式,每个名称代表一个整数值,常用于表示状态、类型等。枚举中的每个值默认从 0
开始逐次递增。
#include <iostream>
enum Color { Red, Green, Blue }; // 定义枚举类型
int main() {
Color favoriteColor = Green;
if (favoriteColor == Green) {
std::cout << "Favorite color is green!\n";
}
return 0;
}
5、字符串常量
字符串常量是使用双引号 "
包裹的字符串,如 "Hello, World!"
。字符串常量在程序中表示一个 const char*
类型的指针,指向以空字符 \0
结尾的字符数组。
#include <iostream>
int main() {
const char* greeting = "Hello, World!";
std::cout << greeting << "\n";
return 0;
}
6、常量指针和指向常量的指针
常量指针是指针本身是常量,指向的地址不可改变。指向常量的指针是指针指向的内容是常量,内容不可更改,但指针本身可以改变指向。
#include <iostream>
int main() {
int x = 10;
int y = 20;
// 常量指针
int* const ptr1 = &x;
// ptr1 = &y; // 错误:指针地址不可改变
// 指向常量的指针
const int* ptr2 = &x;
// *ptr2 = 15; // 错误:不能修改指向内容
ptr2 = &y; // 指针本身可以改变指向的地址
std::cout << "x: " << x << ", y: " << y << "\n";
return 0;
}