是的,你可以用一点技巧来做到这一点。
#include <stdio.h>
int main(){
const int a = 0;
*(int *)&a = 39;
printf("%d", a);
}
在上面的代码中,a
是一个const int
. 使用小技巧,您可以更改常量值。
更新:说明
在上面的代码中, a 被定义为 a const
。例如 a 有一个内存地址0x01
,因此&a
返回相同的地址。当它被强制转换时,(int *)
它成为另一个变量,称为指向 const 的指针。当*
再次访问时,另一个变量可以在不违反 const 策略的情况下被访问,因为它不是原始变量,但由于它被称为指针的地址,因此更改会被反映。
这将适用于 Borland C++ 或 Turbo C++ 等旧版本,但是现在没有人使用它。
这是“未定义的行为”,这意味着根据标准,您无法预测尝试此操作时会发生什么。根据特定的机器、编译器和程序的状态,它可能会做不同的事情。
在这种情况下,最常发生的是答案是“是”。变量,无论是否为 const,只是内存中的一个位置,您可以打破 const 的规则并简单地覆盖它。(当然,如果程序的其他部分依赖于它的 const 数据是恒定的,这将导致严重的错误!)
然而,在某些情况下——最常见的是 const 静态数据——编译器可能会将这些变量放在内存的只读区域中。例如,MSVC 通常会将 const static ints 放在可执行文件的 .text 段中,这意味着如果您尝试对其进行写入,操作系统将抛出保护错误,并且程序将崩溃。
在编译器和机器的其他组合中,可能会发生完全不同的事情。您可以确定的一件事是,这种模式会惹恼任何必须阅读您的代码的人。
试试这个,让我知道。