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

您所在的位置:网站首页 宏或常量const定义法求球的体积 C语言 常量、const常量、define常量、define宏函数

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

2023-08-04 03:14| 来源: 网络整理| 查看: 265

目录 常量、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配对。而且遵循就近原则。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3