C和C++的区别(1)常量和只读变量、数组定义

举报
用户已注销 发表于 2021/11/19 03:38:52 2021/11/19
【摘要】 目录 1,字面值和只读变量 2,const 3,constexpr 1,字面值和只读变量 在C++中,常量包括字面值和只读变量: int a=12345;const int b=123; 这里,12345是字面值,a是变量,b是只读变量。 12345是常量,b是常量,a不是常量。 在C中,常量只包括字面值,只读变量不...

目录

1,字面值和只读变量

2,const

3,constexpr


1,字面值和只读变量

在C++中,常量包括字面值和只读变量


  
  1. int a=12345;
  2. const int b=123;

这里,12345是字面值,a是变量,b是只读变量。

12345是常量,b是常量,a不是常量。

在C中,常量只包括字面值,只读变量不是常量。

上述代码在C语言的解读是,12345是常量,b不是常量。

 

C和C++中,定义数组的大小都只能用常量

所以C++有2种定义数组的方法:


  
  1. const int b=123;
  2. int c[123];
  3. int d[b];

这2中写法都是正确的。

但是在C语言中,上述d数组如果是全局变量就是非法的,如果是局部变量那就是可变长数组

2,const

关键字const叫做限定符,因为它限定了声明的含义。

const变量是区分编译期常量和运行期常量


  
  1. const int b=123;
  2. int d[b];

这是的b编译期常量


  
  1. int f(int a)
  2. {
  3. const int b=a;
  4. int d[b];
  5. cout<<sizeof(d)/sizeof(int);
  6. return 0;
  7. }

这里的b是运行期常量,它的值在编译期是未知的,

所以数组d的定义理论上是非法的,但是我在本地实测,以及力扣实测,都是可以的,应该是编译器做了优化,把这个按照C语言的可变长数组的逻辑去编译了。

于是我在网上找到了另外一种代码,用array检测一个变量是不是常量:


  
  1. #include<iostream>
  2. #include <array>
  3. using namespace std;
  4. int main()
  5. {
  6. int a;
  7. const int b=a;
  8. const int c=10;
  9. //array<int,b>arr;
  10. array<int,c>arr2;
  11. return 0;
  12. }

用运行期常量给array对象分配空间是不行的,必须用编译期常量才行。

总之,const变量是区分编译期常量和运行期常量的,,而字面值当然都是编译期常量。

3,constexpr

先看如下代码:


  
  1. #include<iostream>
  2. #include <array>
  3. using namespace std;
  4. const int f(int a)
  5. {
  6. return a*a;
  7. }
  8. int main()
  9. {
  10. // array<int,f(5)>arr;
  11. return 0;
  12. }

编译不过是因为,f(5)是运行期常量,而array需要的是编译期常量

把const换成constexpr之后:


  
  1. #include<iostream>
  2. #include <array>
  3. using namespace std;
  4. constexpr int f(int a)
  5. {
  6. return a*a;
  7. }
  8. int main()
  9. {
  10. array<int,f(5)>arr; //5是字面值
  11. int a=5;
  12. //array<int,f(a)>arr2; //a是变量
  13. const int b=5;
  14. array<int,f(b)>arr3; //b是编译期常量
  15. const int c=a;
  16. //array<int,f(c)>arr4; //c是运行期常量
  17. return 0;
  18. }

这样,5和b是编译期常量,所以f(5)和f(b)是编译期常量,而f(a)和f(c)都不是编译期常量,所以不能用来分配array对象。

总之,constexpr的作用是,在能返回编译期常量的条件下,就返回编译期常量。

 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/109271874

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。