01_C语言常量介绍和使用

目录

一.字面常量:

二.const 修饰的常变量:

      (1).由const修饰的变量在后续代码赋值中是不允许更改的

     (2).修饰局部变量:

   (3).修饰全局变量(防止全局变量被随意修改):

三.#define 定义的标识符常量:

   (1).有define定义的变量可以直接使用:

     (2).定义宏:

    (3). 条件编译:

 (4).避免宏的副作用:

四.枚举常量:

   (1).枚举类型的定义:

  (2).创建变量:


一.字面常量:

    单独的字符,能直接判断他的值和类型。如:3.14,a。

二.const 修饰的常变量:

 
     (1).由const修饰的变量在后续代码赋值中是不允许更改的

//const - 常属性
//	const int n = 10;//n是变量,但是又有常属性,所以我们说n是常变量
  注:
   上面例子上的 n 被称为 const 修饰的常变量, const 修饰的常变量在C语言中只是在语法层面 限制了。
   变量 n不能直接被改变,但是 n 本质上还是一个变量的,所以叫常变量


     (2).修饰局部变量:

const int num=9;
int const num=9;

   这两种写法是一样的,都表示变量num的值不能被改变,用const修饰变量时,一定要初始化,否则之后就不能再进行赋值了
特殊情况(const用于修饰常量静态字符串):

const char* str="techdreamer";

如果没有const的修饰,我们可能有时候会修改后续的代码,比如str[4]=’L’,这样会导致对只读内存区域的赋值,使程序异常终止。而加上const修饰之后,我们可以立马检查出代码的错误.
补充信息(常量静态字符串):在C语言的内存当中,针对不同的数据我们所存放的位置都是不一样的。 这里只要知道字符串常量属于静态存储类别,存放在静态区。 这就意味着字符串只会被存储一次,在整个程序的生命周期内存在,即使函数被调用多次。 用双引号括起来的内容被视为指向该字符串存储位置的指针。

   (3).修饰全局变量(防止全局变量被随意修改):

全局变量的作用域是整个文件,且全局变量的生存周期为程序运行的整个过程,所以我们应该尽量避免使用全局变量,一旦某个函数改变了全局变量的值,会影响到其他引用这个变量的函数,是一个很隐蔽的操作。如果一定要用全局变量,应该尽量的使用const进行修饰,防止不必要的人为修改,使用 const 修饰过的局部变量就有了静态特性,它的生存周期也是程序运行的整个过程,虽然有了静态特性,但并不是说它变成了静态变量

const更多详细的用法请参考:https://zhuanlan.zhihu.com/p/373141333

三.#define 定义的标识符常量:

格式:#define <宏名/标识符> <字符串>

   (1).有define定义的标识符可以直接使用:


例如下面代码  define定义的 MAX  赋值为10,可以直接在程序中使用,提高了代码的效率.

#define MAX 10
#include <stdio.h>
int main()
{
	
	printf("MAX=%d", MAX);
	return 0;
}
//输入MAX=10

     (2).定义宏------带参数:


       #define可以用于定义宏,即可以使用宏来代替表达式。通过宏,可以将一段复杂的代码用一个简单的名字来表示,提高代码的可维护性和可读性。

    

#define add(x) ((x)+(x))
#include <stdio.h>

int main() {
	int num = 9;
	int sum;
	sum = add(num);//可以直接使用这个表达式:((x)+(x))
	printf("%d的和是:%d", num, sum);
	return 0;
}

    (3). 条件编译:

  #define还可以用于条件编译,即根据某些条件选择性地包含或排除代码。

#include <stdio.h>

#define DEBUG

int main() {
    #ifdef DEBUG
        printf("调试模式下的输出\n");
    #else
        printf("正常模式下的输出\n");
    #endif

    return 0;
}

  #ifdef 即当标识符被定义过,则执行对应下面的程序,否则执行其他的代码。
条件编译语句更多知识点请参考:https://blog.csdn.net/qq_40584593/article/details/85217303

 (4).避免宏的副作用:

     宏的参数在宏展开时可能会被误解,因此在编写宏时需要确保宏的参数没有副作用,以免导致意外行为。

#include <stdio.h>

#define SQUARE1(x) ((x) * (x))
#define SQUARE2(x) (x * x)
int main() {
	int num = 5;
	int result1 = SQUARE1(num + 1);
	int result2 = SQUARE2(num + 1);
	printf("SQUARE1计算后的结果为: %d\n", result1);
	printf("SQUARE2计算后的结果为: %d\n", result2);
	return 0;
}

结果:
   SQUARE1计算后的结果为: 36
  SQUARE2计算后的结果为: 11

上述例子中,result1 相当于(num+1) * (num+1) = 36,而result2相当于num + 1 * num + 1 = 5 + 1 + 5 = 11,是字符上的拼接而非运算后的逻辑拼接,需要注意区分。

更详细的用法可参考:https://blog.csdn.net/PengXing_Huang/article/details/135407360

C语言宏#define(精通详解) - 知乎 (zhihu.com)

四.枚举常量:

     枚举常量即可以把某些数据一一列举出来.使用enum来修饰。

    格式:enum 标识符 {}。

   (1).枚举类型的定义:

enum Sex
{
	MALE,
	FEMALE,
	SECRET
};

//MALE,FEMALE,SECRET - 枚举常量
int main()
{
	//enum Sex s = FEMALE;
	printf("%d\n", MALE);//0
	printf("%d\n", FEMALE);//1
	printf("%d\n", SECRET);//2

	return 0;
}

    上述代码定义的enum Sex是一种枚举类型,{}中内容是枚举类型的可能取值,也可叫作枚举常量。这些枚举常量都是有值的,在不赋值时从0开始,依次往后递增1。

7c381558625147cea317ac0e4e82f9a0.png

// 枚举关键 - enum
//
enum Color
{
	RED,
	YELLOW=6,
	BLUE
};

int main()
{
	enum Color color = BLUE;
	color = YELLOW;
	printf("YELLOW=%d\n",YELLOW);//=6
	printf("LUE=%d\n", BLUE);//=7
	//BLUE = 9; //是不能修改的,改了会报错
	return 0;
}
 赋初值后打印初值内容,如果你有一个没有赋值,会紧接上一个赋值内容+1,这里BLUE并没有赋值,但我们知道YELLOW是6,按照枚举规则,这样BLUE=7,是因为BLUE=YELLOW+1

  (2).创建变量:

     我们前面说过, enum Sex、enum Color这种叫作枚举类型,既然它是类型,它就可以创建变量,代码如下:
    
enum Color
{
	RED,
	YELLOW,
	BLUE
};

int main()
{
	enum Color color = BLUE;//创建color变量
	color = YELLOW;
	return 0;
}

关于enum的更多使用可以参考此文章:https://zhuanlan.zhihu.com/p/349458733

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值