首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以更改C中的const值,但不能在C++中更改const的值

可以更改C中的const值,但不能在C++中更改const的值
EN

Stack Overflow用户
提问于 2014-04-16 05:51:11
回答 5查看 123关注 0票数 0

考虑以下代码

代码语言:javascript
运行
复制
#include <stdio.h>
#include <string.h>

main()
{
   const int a = 2;
   long p = (long)&a;
   int *c = (int *)p;
   *c =3;
   printf("%d", a);
}

此代码可以在C中将值更改为a,但不能在C++中更改。我知道C++正在应用优化,并将a的实例替换为2。那么,这是C++中的bug修复,还是由于优化而偶然修复的bug?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-04-16 05:56:33

直接或间接地修改const值是一种未定义的行为。这可以在C中编译,甚至可以在您的机器上运行,但它仍然是未定义的行为。

C和C++在这方面的区别是:对于const int a = 2,C++将a视为常量表达式,例如,您可以使用a作为数组维度:

代码语言:javascript
运行
复制
int n[a];  //fine in C++

但是在C中,a不是一个常量表达式,具有相同的代码:

代码语言:javascript
运行
复制
int n[a];  //VLA in C99

这里,n不是一个固定大小的数组,而是一个可变长度的数组.

票数 6
EN

Stack Overflow用户

发布于 2014-04-16 05:55:55

--这不是C与C++之间的问题。通过修改const值(以及通过long对指针进行双转换),以两种语言进入未定义行为的领域。因此,区别只是一个问题,即未定义的行为选择如何表现自己。

票数 6
EN

Stack Overflow用户

发布于 2014-04-16 05:56:59

您正在抛弃&a之外的一致性,修改指向值,这在C和C++中都是未定义的行为(通过long的旅行只是添加了一些额外的UB)。在C++中,您的编译器碰巧对常量进行了更积极的优化,但是情况并没有改变。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23101049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档