C语言 常量、const常量、define常量、define宏函数

目录

  • 常量、const常量、define常量、define宏函数
  • 字面常量
    • 整数常量
    • 浮点常量
    • 字符常量
    • 字符串常量
  • 常量的定义
  • `const`关键字修饰的常变量
  • `#define`预处理器定义的标识符常量和宏函数
  • `#define`预处理器定义的宏函数
    • 宏函数和函数的区别
  • const和#define定义常量的区别

常量、const常量、define常量、define宏函数

字面常量

常量是固定值,在程序执行期间不能被改变,这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如:整数常量、浮点常量、字符常量、或字符串常量,也有枚举常量。
常量的值在定义后不能修改

整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x或0X表示十六进制,0表示八进制,不带前缀则表示十进制。整数常量也可以带一个后缀,后缀是U或L的组合,U表示无符号整数(unsigned),L表示长整数(long)。后缀可以是大写,也可以小写,UheL的顺序任意。

进制 数值
十进制 89
二进制 01011001
八进制 0131
十六进制 0x59
整数 89
无符号整数 89u
长整数 89l
无符号长整数 89ul

浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成‘可以使用小数形式或者指数式来表示浮点常量。
举例说明:
3.14159;//double常量
314159E-5;//科学计数法
3.14159f;float常量

字符常量

字符常量是括在单引号内,例如:‘x’可以存储在char类型的变量中。字符常量可以是一个普通的字符(如‘x’)、一个转义序列(如‘\t’)。

字符串常量

字符串字面值或常量是括在双引号“”中的,一个字符串包含类似于字符常量的字符:普通的字符,转义序列和通用字符。换行书写:可以使用\做分隔符,把一个很长的字符串常量进行分行。
例如:
“hello word”或
“hello
\world”

常量的定义

定义常量的两种方式:
1.使用#define预处理器
2.使用const关键字

const关键字修饰的常变量

const关键字限定变量为只读的形式
const 数据类型 常量名 = 常量值;
const关键字修饰的常变量不可以修改。const常量可以放在main主函数前作为全局常量,也可以放在main主函数内作为局部变量。
应用:

#include 
const double PI = 3.14; 
int main()
{
	//PI = 3.1415;//const修饰的常量PI的值不可以修改
	//const double PI = 3.14; //也可以放在main主函数内
	double area;
	double r = 5.4;//半径
	area = PI * r * r;
	printf("圆的面积:%lf\n",area);
	return 0;
}

#define预处理器定义的标识符常量和宏函数

#define预处理器定义标识符常量的形式
define 常量名 常量值(常量名一般大写)
#define定义的常量是不可以修改的。且#define预处理器定义常量必须写在main主函数前面。#define预处理器定义的标识符常量和宏函数后不跟分号
应用:

#include 
#define PI 3.14
int main()
{
	//PI = 3.1415;//define常量PI的值不可以修改
	double area;
	double r = 5.4;//半径
	area = PI * r * r;
	printf("圆的面积:%lf\n",area);
	return 0;
}

#define预处理器定义的宏函数

用法:

#include 
#define ADD(x,y) ((x) + (y))//定义宏
int main()
{
	int sum = ADD(2, 3);
	printf("sum:%d\n",sum);
	sum = 10 * ADD(2, 3);
	printf("10sum:%d\n",sum);
	return 0;
}

输出:

sum:5
10sum:50
请按任意键继续. . .

宏函数不是真正的函数,但是和函数用法相似。

宏函数和函数的区别

宏函数:替代机制
函数:调用机制,有性能开销
define只是简单的替换,易造成边界效应。
(边界效应下面演示)

const和#define定义常量的区别

1.const定义的常量时带类型,define不带类型。
2.const是在编译、运行的时候起作用,而define是在编译的预处理阶段起作用。
3.define只是简单的替换,没有类型检查。简单的字符串替换会导致边界效应
边界效应实例:

#include 
#define A 1
#define B A + 3
#define C A/B * 3//这时C表示1/1+3*3 = 1 + 9= 10
//想要运算(1 / (1 + 3)) * 3 = 0
//define只是简单的替换!!!!!!!
int main ()
{
	printf("%d\n",1/(1+3)*3);//0
	printf("%d\n",1 / 1 + 3 * 3);//10
	printf("%d\n",C);//10
	return 0;
}

输出:

0
10
10
请按任意键继续. . .

要想避免边界效应的产生,就要在定义宏函数时注意加上括号,提升相关运算的优先级。
改正宏函数之后的代码:

#define A 1
#define B (A + 3)
#define C (A/B * 3)//运算(1 / (1 + 3)) * 3 = 0

4.const常量可以进行调试的,define是不能进行调试的,主要是预编译阶段就是已经替换掉了,调试的时候就没它了。
5.const不能重定义,不可以定义两个一样的,而#define通过#undef取消某个符号的定义,再重新定义。

#undef取消之前某个符号的定义,#define之后可以重定义:

#define N 99
#undef N//#undef N 取消#define N定义为99,方便下面的N重定义
#define N 999

const重定义错误:

const double J = 3.14;
const double J = 3.1415;//错误,不能对J重新定义

const重定义,编译时就开始报错:error C2374: “J”: 重定义;多次初始化
6.define可以配合#ifdef、#endif、#ifndef来使用,可以让代码更加灵活,比如可以通过#define来启动或者关闭调试信息。
#ifdef、#endif、#ifndef应用实例:

#include 
#define DEBUG
int main()
{
#ifdef DEBUG  //#define定义了DEBUG则执行下面一行代码
	printf("OK!定义了#define DEBUG\n");
#endif  //结束#ifdef DEBUG//不能没有,没有会报错中的 error C1070: **文件中的#if/#endif 对不匹配

#ifndef DEBUG  //#define没有定义DEBUG则执行下面一行代码
	printf("NO!没有定义#define DEBUG\n");
#endif  //结束#ifndef DEBUG//不能没有,没有会报错error C1004: 发现意外的文件尾
	return 0;
}

输出:

OK!定义了#define DEBUG
请按任意键继续. . .

其中,每个#ifdef 或 #ifnde 后都要和#endif配对。而且遵循就近原则。

你可能感兴趣的:(C语言)