我在代码中写了一些类似的东西
const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)
这适用于所有编译器吗?为什么GCC编译器没有注意到我们正在改变一个常量变量?
const实际上并不意味着"不变".C中"常量"的东西具有在编译时确定的值; 文字42就是一个例子.该const关键字实际上意味着只读.例如,考虑一下:
const int r = rand();
Run Code Online (Sandbox Code Playgroud)
在r程序执行时间之前不确定值,但const关键字表示r在初始化之后不允许修改.
在你的代码中:
const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;
Run Code Online (Sandbox Code Playgroud)
赋值ptr = &x;是一种约束违反,这意味着一个符合要求的编译器需要对它进行投诉; 您不能合法地将const int*(指向const int的指针)值分配给非const int*对象.如果编译器生成可执行文件(它不需要执行;它可能只是拒绝它),那么行为不是由C标准定义的.
例如,生成的代码可能实际存储值2的x-但是以后的参考x可能会产生价值1,因为编译器知道那个x不能被初始化后修改.它知道,因为你这么说,通过定义x为const.如果你撒谎到编译器,后果可能是任意的坏.
实际上,可能发生的最糟糕的事情是程序的行为与您期望的一样; 这意味着您有一个很难检测到的错误.(但你应该得到的诊断将是一个很大的线索.)