我现在要了解的一件事。问题是关于C中的const
限定符。在我的程序中,我想要更改用const限定符定义的变量的值。
例如:
int main()
{
const int i=40;
i=50 ; // error
}
但是在上面的例子中有没有办法改变i的值。请让我知道。 谢谢
答案 0 :(得分:7)
在任何具有明确定义的行为的程序中,i
都无法修改。
C99§6.7.3(“类型限定词”)/ 5明确说明:
如果尝试通过use修改使用const限定类型定义的对象 对于具有非const限定类型的左值,行为是未定义的。
i
是使用const限定类型(const int
)定义的对象。它是一个不可修改的左值:你不能修改它,因为它是const限定的。修改它的唯一方法是使用强制转换去除const限定,这将导致程序显示未定义的行为。
答案 1 :(得分:5)
首先,你可能不应该这样做。
其次,是的,如果您必须通过获取其地址并参考它,那么您可以:
const int i = 40;
*(int*)&i = 50;
// i is now 50
请第三,请不要这样做。
编辑:正如其他人指出的那样,这表现出未定义的行为。您假设您的编译器将此值存储在可寻址的位置,而不是必须的。 (一个常数值可以用它的直接值代替,并且“使用它的地址”并不意味着什么。)你被警告了。
答案 2 :(得分:4)
有两种方式。
首先是一种你不感兴趣的方式。标准允许这种情况发生,但你可能无法控制它,所以你并不感兴趣。标准说你可以定义像
这样的东西const volatile int *pSomething;
因为实现可能会改变指向的东西(例如它可能是一个计时器)但你可以禁止你的程序更改它。
第二种是您感兴趣的方式,但标准不允许。颜已经给出了这样的答案。
*(int*)&i
是一个可修改的左值,根据什么是可修改的左值的规则。但是,如果您实际尝试修改此左值,则违反标准,因为实际对象i被定义为const。结果是未定义的行为。实现可能会做你想要的,或者它可能会保持不变,它可能会中止你的程序,或者它可能会格式化你的硬盘。
这是一种做你想做的事情的方法。
int theRealI;
const int *pTheRealI = &theRealI;
#define i (*pTheRealI)
然后我将是只读的,但是如果你想修改你的实力,你可以。