![]() |
逃课的茶壶 · 如何用three.js繪製一個四面填充不同材 ...· 2 周前 · |
![]() |
谈吐大方的仙人球 · 如何用three.js繪製一個四面填充不同材 ...· 2 周前 · |
![]() |
打篮球的自行车 · /Zc:strictStrings(禁用字符 ...· 6 天前 · |
![]() |
博学的苦瓜 · 如何解决RDS ...· 9 月前 · |
![]() |
儒雅的机器猫 · Single-Cell ...· 1 年前 · |
![]() |
乖乖的手术刀 · 音视频领域的知识怎么开始学习? - 知乎· 1 年前 · |
![]() |
逆袭的葡萄酒 · Python time ...· 1 年前 · |
![]() |
爱热闹的奔马 · C++中将csv文件中的数据存储到数组中_c ...· 2 年前 · |
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做 字面量 。
常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
下面列举几个整数常量的实例:
以下是各种类型的整数常量的实例:
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
下面列举几个浮点常量的实例:
布尔常量共有两个,它们都是标准的 C++ 关键字:
我们不应把 true 的值看成 1,把 false 的值看成 0。
字符常量是括在单引号中。如果常量以 L(仅当大写时)开头,则表示它是一个宽字符常量(例如 L'x'),此时它必须存储在 wchar_t 类型的变量中。否则,它就是一个窄字符常量(例如 'x'),此时它可以存储在 char 类型的简单变量中。
字符常量可以是一个普通的字符(例如 'x')、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。
在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:
转义序列含义 \\\ 字符 \' ' 字符 \"" 字符 \?? 字符 \a警报铃声 \b退格键 \f换页符 \n换行符 \r回车 \t水平制表符 \v垂直制表符 \ooo一到三位的八进制数 \xhh . . .一个或多个数字的十六进制数下面的实例显示了一些转义序列字符:
当上面的代码被编译和执行时,它会产生下列结果:
Hello World字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
您可以使用 \ 做分隔符,把一个很长的字符串常量进行分行。
下面的实例显示了一些字符串常量:
#include <iostream>绝罗
419***405@qq.com
类型和安全检查不同
宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;
const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查
编译器处理不同
宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;
const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据
存储方式不同
宏定义是直接替换,不会分配内存,存储于程序的代码段中;
const常量需要进行内存分配,存储于程序的数据段中
定义域不同
void f1 () #define N 12 const int n 12; void f2 () cout<<N <<endl; //正确,N已经定义过,不受定义域限制 cout<<n <<endl; //错误,n定义域只在f1函数中定义后能否取消
宏定义可以通过#undef来使之前的宏定义失效
const常量定义后将在定义域内永久有效
void f1() #define N 12 const int n = 12; #undef N //取消宏定义后,即使在f1函数中,N也无效了 #define N 21//取消后可以重新定义是否可以做函数参数
宏定义不能作为参数传递给函数
const常量可以在函数的参数列表中出现
飘逸的风
pia***139@aliyun.com
123
xuz***gsong@163.com
枫
318***194@qq.com
const 是 constant 的简写,只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。也就是说const意味着只读(readonly)。
const修饰一个变量,一定要给这个变量初始化值,若不初始化,后面就无法初始化。
adults
223***32@qq.com
WXGZCC
192***1103@qq.com
const 和 define 定义常量时,两个数的范围不同。
#include<cstdio> using namespace std; const int maxn=1e+10; int main() printf("%d",maxn); return 0;然后输出是:
2147483647如果用 define 定义的话:
#include<cstdio> #define maxn 1e+10 using namespace std; int main() printf("%d",maxn); return 0;536870912但是,如果将输出的 %d 改为 %lld 的话,输出为:
4756540486875873280那么,可以思考一下,如果将 const 的数据也改成 longlong 的话,输出为:
10000000000刚好为我们想要的那个答案。
数据的范围还有输出的格式很重要!!!
初出茅庐的攻城狮
yan***000@126.com
smallhu
107***3783@qq.com
角度1 : 就定义常量说的话, const 定义的常数是变量 也带类型, #define 定义的只是个常数 不带类型。
角度2 : 就起作用的阶段而言,#define 是在编译的预处理阶段起作用,而 const 是在 编译、运行的时候起作用。
角度3 : 就起作用的方式而言,#define 只是简单的字符串替换,没有类型检查。而 const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 正因为 define 只是简单的字符串替换会导致边界效应,具体举例可以参考下面代码:
#define N 2+3 // 我们预想的 N 值是 5,我们这样使用 Ndouble a = N/2; // 我们预想的 a 的值是 2.5,可实际上 a 的值是 3.5
角度4 : 就空间占用而言, 例如:
#define PI 3.14 //预处理后 占用代码段空间 const float PI=3.14; // 本质上还是一个 float,占用数据段空间
角度5 : 从代码调试的方便程度而言, const 常量可以进行调试的,#define 是不能进行调试的,因为在预编译阶段就已经替换掉了
角度6 : 从是否可以再定义的角度而言, const 不足的地方,是与生俱来的,const 不能重定义,而 #define 可以通过 #undef 取消某个符号的定义,再重新定义。
HRZGJ
130***5956@qq.com
1、const 关键字出现在 * 的左边:指针指向的内容不能被修改。
2、const 关键字出现在 * 的右边:指针本身不能被修改。3、const 关键字出现在 * 的两边:指针指向的内容和指针本身都不能被修改。
#include <iostream> using namespace std; int main() int a=1; int b; /**指向const的指针,指针指向的内容不能被修改**/ const int *p1; int const *p2; /**const指针,指针本身不能被修改,必须初始化**/ int *const p3=&a; /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/ const int* const p4=&a; int const* const p5=&b; p1=p2=&a; //true (指针本身的值可以改变) *p1=*p2=8; //false(指针指向的内容不能被修改) *p3=5; //true (指针指向的内容可以改变) p3=p1; //false(指针本身的值不能改变) p4=p5;//false(指针本身和它指向的内容都是不能被改变) *p4=*p5=4; //false(指针本身和它指向的内容都是不能被改变) return 0; }
Shmily
331***1182@qq.com
const 关键字出现在 * 的左边:指针指向的内容不能被修改。称其为指向常量打的指针,此时也被称为底层const
const 关键字出现在 * 的右边:指针本身不能被修改,称其为常量指针,此时也被称为顶层const,
const 关键字出现在 * 的两边: 指针指向的内容和指针本身都不能被修改。此时同时拥有底层和顶层const。
(1)底层指针指向的内容并非不可修改,只是无法通过该指针进行修改,换句话来说,底层指针“自作多情”地认为自己指向的内容是无法修改的,实际上可以通过赋值等方法改变其指向的内容。
(3)底层const会给变量施加一个限制,在执行拷贝操作时,非底层const的对象无法给具有底层const的变量赋值。
int main() int a = 1; const int *p1 = &a; //底层const, 也可以用int const *p1 = &a;. *p1 = 2; //非法, 无法通过p1更改a的值. p1++; //合法, p1的值(指向的地址)是可以更改的. a = 2; //合法, 只是无法通过p1解引用的方式更改a的值, 其他方式可以. int *const p2 = &a; //顶层const, p2是常量. *p2 = 3; //合法, p2指向地址的内容可以更改. p2++; //非法, p2的值(指向的地址)无法更改. a = 4; //合法, p2指向地址的内容可以更改. const int *const p3 = &a; //同时具有底层和顶层const, p3的值(指向的地址)无法修改, 且无法通过p3解引用进行更改. int *p4 = p1; //非法, p1是const *int(底层const), 无法给普通int*赋值. int *p5 = p2; //合法, p2是*const int(顶层const), 赋值时没有限制. const int *p6 = p1; //合法, p6也是const *int(底层const), 可以获得p1的赋值.
![]() |
博学的苦瓜 · 如何解决RDS PostgreSQL中删除数据库时出现There are 2 other sessions using the database报错_云数据库 RDS(RDS)-阿里云帮助中心 9 月前 |
![]() |
儒雅的机器猫 · Single-Cell Transcriptome Analysis Reveals the Importance of IRF1/FSTL1 in Synovial Fibroblast Subse 1 年前 |
![]() |
乖乖的手术刀 · 音视频领域的知识怎么开始学习? - 知乎 1 年前 |