常量表达式的问题

sherwinchen 2018-12-19 06:31:48
假如有全局变量 int i=42;
在主函数中 int *const p=&i;
这时的p可不可算作常量表达式(因为constexpr限定的指针可以用全局变量的地址初始化)
...全文
573 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeventhBlue 2018-12-25
  • 打赏
  • 举报
回复
常量表达式(const expression):是指值不会改变并且在编译过程中就得到计算结果的表达式。(运行中得到结果的不能成为常量表达式)。
const int i=3; //是一个常量表达式
const int j=i+1; //是一个常量表达式
int k=23; //k的值可以改变,从而不是一个常量表达式
const int m=f(); //不是常量表达式,m的值只有在运行时才会获取。

constexpr变量:
C++11允许声明constexpr类型来由编译器检验变量的值是否是一个常量表达式。声明为constexpr的必须是一个常量,并且只能用常量或者常量表达式来初始化。
constexpr int i=3;
constexpr int j=i+1;
constexpr int k=f(); //只有f()是一个constexpr函数时k才是一个常量表达式
一般来说,若果一旦认定变量是一个常量表达式,那就把它声明为constexpr类型。
尽管指针和引用都可以定义为constexpr,但是他们的初始值却受到了严格的限制。一个constexpr指针的初始值必须是nullptr或者0,或者是存储某个固定地址的对象。函数体中定义的变量并非存放在固定地址中,因此constexpr指针不可以指向这样的变量。相反的,对于所有函数体之外的对象地址是固定不变的,可以用constexpr来定义;
必须明确一点,在constexpr声明中,如果定义了一个指针,限定符号constexpr仅仅对指针有效,与指针所指对象无关。
const int *p=nullptr; //p是一个指向整型常量的指针(pointer to const)
constexpr int *p1=nullptr; //p1是一个常量指针(const pointer)

所以对于你的问题是常量表达式吧!
棉猴 2018-12-21
  • 打赏
  • 举报
回复
《C++Primer第五版中文版》中提到
常量表达式(const expression)是指不会改变并且在编译过程中就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式
一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如:
const int max_files = 20;  //是
const int limit = max_files + 1; //是
taodm 2018-12-21
  • 打赏
  • 举报
回复
可以。全局变量的地址可以用做模板的非类型参数就是一个例证。
赵4老师 2018-12-20
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
Xyino_Snake 2018-12-20
  • 打赏
  • 举报
回复
为此我专门在VS2015下试了一下。

#include<cstdio>

int x = 32;
constexpr int * const f() { return &x; }

int main()
{
int * const x = f();
}

程序通过了。说明确实可以。
lin5161678 2018-12-19
  • 打赏
  • 举报
回复
不能
AlbertS 2018-12-19
  • 打赏
  • 举报
回复
p这个变量是常量,不能再给它赋其他值了
真相重于对错 2018-12-19
  • 打赏
  • 举报
回复
const修饰它紧挨着右边的

65,198

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧