考虑以下代码
#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?
发布于 2014-04-16 05:56:33
直接或间接地修改const
值是一种未定义的行为。这可以在C中编译,甚至可以在您的机器上运行,但它仍然是未定义的行为。
C和C++在这方面的区别是:对于const int a = 2
,C++将a
视为常量表达式,例如,您可以使用a
作为数组维度:
int n[a]; //fine in C++
但是在C中,a
不是一个常量表达式,具有相同的代码:
int n[a]; //VLA in C99
这里,n
不是一个固定大小的数组,而是一个可变长度的数组.
发布于 2014-04-16 05:55:55
--这不是C与C++之间的问题。通过修改const
值(以及通过long
对指针进行双转换),以两种语言进入未定义行为的领域。因此,区别只是一个问题,即未定义的行为选择如何表现自己。
发布于 2014-04-16 05:56:59
您正在抛弃&a
之外的一致性,修改指向值,这在C和C++中都是未定义的行为(通过long
的旅行只是添加了一些额外的UB)。在C++中,您的编译器碰巧对常量进行了更积极的优化,但是情况并没有改变。
https://stackoverflow.com/questions/23101049
复制相似问题