const和 枚举的一些知识。

本文详细介绍了C++中const关键字的用法,包括声明常量、修饰指针及引用等,并探讨了枚举类型(enum)的定义及其使用场景。

一、 const

const 可以用来声明一个常量, 当我们用const来修饰一个变量的时候, 我们就不能再后面给它赋值了。

1、 用const 来修饰一个变量

const int a = 5;

如果我们想要在后面给它赋值,编译器就会报错。

例如:

#include <stdio.h>

int main()
{
     const int a = 5;
     int  a = 6;
     return 0;
}
编译器就会报出类似这样的错误 ““a”: 不能给常量赋值”!

2、用const 来修饰一个指针。

int x = 5;

① const int *p = &x;

② int const *p = &x;

③ int  * const p = &x;

①和②的代码是完全一样的, 但是③的代码和上面两个是完全不一样的。 ①和②表示指针 p 所指向的内容是不能变的 

#include <stdio.h>
int main()
{
    int a = 5;
    const int *p = &a;
    *p = 6;
    return 0;
}
这样系统也是会报错的,但是我们却可以改变指针本身, 让它指向另一个变量。
int main()
{
	using namespace std;

	int a = 5;
	int y = 6;
	const int *p = &a;
	p = &y;
	

	return 0;
}
这样是正确的, 我们只是让指针所指向的内容不能变,指针本身还是可以改变的。

接下来我们看看③的代码

const 修饰的是 p, 是指针的本身,说明指针是不能改变的。

int main()
{
	using namespace std;

	int a = 5;
	int y = 6;
	int *const p = &a;
	p = &y;
	
	return 0;
}
如图所示,这样的写法是错误的, 因为我们试图改变p, 让它指向y,这样是不允许的。
int main()
{
	using namespace std;

	int a = 5;
	int y = 6;
	int *const p = &a;
	*p = 7;
	
	return 0;
}
这个时候我们就可以改变p所指向的内容了。

这个时候我们要注意 const 的位置, 也就是const 修饰的对象。


如果我们既不想改变指针本身, 也不想改变指针所指向的变量的内容我们可以这样写: const int * const p  = &a;



3、用const 来修饰引用

int a = t;

const int &b = a;

这样我们就不能通过b来修改a的值了。

#include <iostream>

int main()
{
	using namespace std;

	int a = 5;
	
	int const &b  = a;
	b = 6;
	cout << a << endl;
	system("pause");
	return 0;
}
这个代码试图通过b来修改a 的值, 这是不允许的,这样编译的时候编译器会给我们报错, “b”: 不能给常量赋值。但是我们可以直接修改a的值 a = 7, 这是可以的。

【注意】 我们在使用const 的时候一定要初始化!!!


二、 enum

枚举类型就是指它 的值为符号常量而不是字面值的类型。


声明枚举变量:

enum Liquid{OUNCE = 1, CPU = 8, PINT = 16, QUART = 32, GALLON = 128};
enum Liquid jar;


枚举类型的变量实际上是以整型的方式存储的,这些符号名实际值都是一个整型值。

如果我们没有给这些符号名赋初值, 那么第一符号名就是0, 后面的就依次递增, 如果我们就初始化了一部分, 那么后面的符号名就比前面的大一, 依次递增。

enum Liquid{OUNCE = 3, CPU, PINT, QUART, GALLON = 128}; CPU的值就是4, 后面依次递增。


声明完枚举变量之后我们就可用它们了

jar = CPU ; 这样jar 的值就是CPU的值了,

要注意的一点就是, 根据编译器的不同我们也许不能将两个字符名相加然后赋给jar,

在visual studio 2010 中

#include <stdio.h>
#include <stdlib.h>

int main()
{
	enum Liquid{OUNCE = 3, CPU, PINT, QUART, GALLON = 128};
	enum Liquid jar;

	jar = QUART;

	printf("%d\n", jar);
	jar = PINT + CPU;
	printf("%d\n", jar);
	system("pause");
	return 0;
}
这样的编译时不能同过的,编译器会报出这样的错误  “=”: 无法从“int”转换为“main::Liquid”;, 但是这在Linux中却是可以编译通过的, 而且能够得到我们想要的答案。

如果我们想在visual studio 2010 中将两个字符名相加,然后赋给jar 我们必须要强制类型转换 (enun Liquid)(PINT + CPU);

#include <stdio.h>
#include <stdlib.h>

int main()
{
	enum Liquid{OUNCE = 3, CPU, PINT, QUART, GALLON = 128};
	enum Liquid jar;

	jar = QUART;

	printf("%d\n", jar);
	jar = (enum Liquid)(PINT + CPU);
	printf("%d\n", jar);
	system("pause");
	return 0;
}
这样就能够编译通过了, 而且得到了我们想要的值, 9。



<think> 首先,用户的问题是:“我想查找C语言枚举知识点 请问C语言枚举知识点”。这是关于C语言枚举类型的知识点查询。 从系统级指令中,我需要遵守: 1. 所有行内数学表达式使用$...$格式。 2. 独立公式使用$$...$$格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 另外,用户可见层指令:回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 用户提供了几个引用: - 引用[1]: C语言枚举类型(Enum):定义形式为:enum typeName{ valueName1, valueName2, valueName3, ...... };enum 类型名{名字1,名字2} 枚举 ...[^1]。 - 引用[2]: C语言:枚举知识点总结。使用枚举类型声明符号名称来表示整形常量。使用enum关键字,可以创建一个新“类型”并指定他可具有的值(实际上,enum常量是int类型,因此,只要能使用int类型的地方就可以使用枚举类型)。枚举类型的目的是提高程序的可读性。 [^2]。 - 引用[3]: 与宏定义相比枚举的优点: ① 增加代码的可读性可维护性; ② #define定义的标识符比较枚举有类型检查,更加严谨; ③ 防止了命名污染(封装); ④ 便于调试; ⑤ 使用方便,一次可以定义多个常量 。 联合体 [^3]。 - 引用[4]: 【C语言】 知识点汇总--基础知识点梳理(超全超详细)。在这里面,我们尤其要搞懂哪些值是常量... struct与union结构体联合体 [^4]。 引用[4]似乎有误或不完整,因为它提到了结构体联合体,但没有具体关于枚举的新信息。引用[1],[2],[3]提供了关于枚举的直接信息。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。” 但在这个对话中,这是第一个用户消息,所以没有“上一次的问题回答”。因此,我应该基于提供的引用一般知识来回答。 关键知识点总结: - **定义枚举**: 使用`enum`关键字定义新类型,包含一组命名的整数常量。如`enum Color { RED, GREEN, BLUE };`。 - **目的**: 提高代码的可读性可维护性。用符号名代替魔数。 - **本质**: 枚举常量是`int`类型,所以可以在任何使用`int`的地方使用枚举。 - **优点 vs 宏定义**: 1. 增加可读性可维护性。 2. 有类型检查,更严谨(编译器可以检查类型)。 3. 防止命名污染(封装作用)。 4. 便于调试(在调试器中可以看到符号名)。 5. 使用方便,一次定义多个常量。 - **语法**: `enum typeName { value1, value2, ... };`。值默认从0开始,但可以指定值,如`enum { ONE=1, TWO=2 };`。 在回答中,我需要结构清晰,逐步解释。使用中文。 组织回答: 1. **引入枚举的概念**:解释什么是枚举,为什么使用它。 2. **定义使用**:描述语法,如何声明定义枚举变量。 3. **枚举常量的性质**:说明它们是整数常量,默认值等。 4. **优点**:与宏定义比较,突出优势。 5. **示例代码**:提供一个简单的C代码示例来展示枚举的使用。 6. **相关知识点**:提到与结构体、联合体的区别(如果需要,但引用[4]提到了联合体)。 7. **生成相关问题**:结束时添加相关问题。 添加引用标识:当引用特定段落时,在末尾添加如[^1]。 由于引用是提供的,我应该自然地融入它们。 数学表达式:枚举中可能没有太多数学,但如果有整数表达式,使用$...$,比如在解释默认值递增时,使用行内数学。 例如:默认值从$0$开始,依次递增$1$。 独立公式:可能不需要,因为枚举不涉及复杂数学。 回答结构: - 开头:简要介绍枚举。 - 主体:分点解释知识点。 - 结束:总结,并添加相关问题。 相关问题生成:基于主题,如“枚举与宏定义的区别”、“枚举的实际应用”等。 列出相关问题: 1. 枚举类型在C语言中是如何存储的? 2. 枚举宏定义在性能上有什么区别? 3. 如何在不同源文件中共享枚举定义? 类似示例中的格式。 现在,草拟回答。 </think>### C语言枚举知识点总结 C语言中的枚举(Enum)是一种用户自定义的数据类型,用于定义一组命名的整数常量,以提高代码的可读性可维护性。枚举通过`enum`关键字创建,本质上每个枚举常量都是`int`类型的值,因此可以在任何使用整数的地方使用枚举类型。下面我将逐步解释枚举的核心知识点,内容基于引用资料并结合C语言标准进行说明。 #### 1. **枚举的定义基本语法** - **定义形式**:使用`enum`关键字声明一个新类型,后跟类型名一组常量名称。语法格式为: ```c enum typeName { valueName1, valueName2, valueName3, ... }; ``` 例如,定义一个表示颜色的枚举: ```c enum Color { RED, GREEN, BLUE }; // RED、GREEN、BLUE 是枚举常量 ``` 这里,常量默认从整数$0$开始递增:$RED=0$, $GREEN=1$, $BLUE=2$[^1][^2]。 - **指定值**:可以为枚举常量显式赋值,未指定值的常量自动递增: ```c enum Status { OK=200, ERROR=404, PENDING }; // PENDING 自动为405 ``` 这允许灵活定义常量序列,例如在状态码中使用。 #### 2. **枚举常量的性质用途** - **类型值**:枚举常量本质上是`int`类型,在内存中占用整数大小(通常4字节)。因此,枚举变量可以赋值给整数变量,反之亦然: ```c enum Color c = RED; int num = c; // num 值为0 ``` 枚举的目的是用符号名替代魔数(magic numbers),例如用`RED`代替$0$,使代码更易读[^2]。 - **作用域封装**:枚举定义在函数外时是全局的,但在函数内时作用域受限。这有助于防止命名冲突(命名污染),因为枚举常量封装在类型中[^3]。 #### 3. **枚举的优点(与宏定义比较)** 枚举比`#define`宏定义更安全高效,主要优势包括: - **可读性可维护性**:枚举提供类型化的符号名,代码更直观。例如,`enum Direction { UP, DOWN }`比`#define UP 0`更易维护[^3]。 - **类型检查**:编译器会检查枚举变量的赋值是否有效(如避免无效整数值),而宏定义只是文本替换,无类型安全[^3]。 - **调试便捷**:在调试器(如GDB)中,枚举常量显示为名称而非数字,便于追踪问题[^3]。 - **一次定义多个常量**:枚举允许在一个语句中定义多个相关常量,减少重复代码[^3]。 - **防止命名污染**:枚举常量属于类型作用域,避免全局命名冲突,而宏定义易引起污染[^3]。 #### 4. **枚举的使用示例** 以下是一个完整的C代码示例,展示枚举的声明、赋值输出: ```c #include <stdio.h> // 定义枚举类型 enum Weekday { MON=1, TUE, WED, THU, FRI, SAT, SUN }; // TUE自动为2, SUN为7 int main() { enum Weekday today = WED; printf("Today is day number: %d\n", today); // 输出: 3 // 枚举与整数的互操作 int dayNum = 5; if (dayNum == FRI) { printf("It's Friday!\n"); } return 0; } ``` 在这个例子中,枚举`Weekday`提高了代码可读性,避免直接使用数字如$5$表示周五。 #### 5. **注意事项** - **常量不可修改**:枚举常量是只读的(类似`const`),不能重新赋值。例如,`RED = 10;`会编译错误[^4]。 - **与联合体结构体的区别**:枚举用于定义常量集合,而结构体(`struct`)联合体(`union`)用于组合不同类型的数据。枚举不占用额外内存,仅作为整数别名[^4]。 - **兼容性**:在C语言中,枚举被视为整数,但C++中支持强类型枚举(`enum class`),提供更严格的类型检查。 枚举是C语言中优化代码质量的实用工具,尤其在状态机、错误码或选项标志等场景中广泛应用。如果您有具体代码场景,我可以进一步分析! ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值