能够在C中更改const的值,但不能在C++中更改

Ank*_*kur 0 c c++ optimization const

请考虑以下代码

#include <stdio.h>
#include <string.h>

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

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

NPE*_*NPE 6

这不是C vs C++问题.通过修改const值(以及通过a双重转换指针long),可以在两种语言中输入未定义行为的范围.因此,差异仅仅取决于未定义行为如何选择表现自己.


Yu *_*Hao 6

const无论是直接还是间接修改值,都是未定义的行为.这可能在C中编译,甚至可能在您的机器上运行没有问题,但它仍然是未定义的行为.

C和C++之间的区别在于:with const int a = 2,C++将其a视为常量表达式,例如,您可以将其a用作数组维度:

int n[a];  //fine in C++
Run Code Online (Sandbox Code Playgroud)

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

int n[a];  //VLA in C99
Run Code Online (Sandbox Code Playgroud)

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