考虑以下两种情况。 case1:编译器错误 - >错误:只读变量'x'
的增量 #include<stdio.h>
main()
{
const int x=5;
printf("%d",++x);
}
case2:成功完成输出6.为什么?
#include<stdio.h>
main()
{
const int x=5;
int *ptr=&x;
++(*ptr);
printf("%d",x);
}
答案 0 :(得分:3)
int *ptr=&x;
是违反约束的行为,即&#34;错误&#34;,无效代码。 C语言不支持将const int *
类型隐式转换为int *
类型。您的编译器肯定会为此发出诊断消息。
在诊断消息之后,假定您的编译器以某种方式同意编译它,您的程序的行为将不再由C语言定义。许多C编译器可以配置为拒绝编译此代码,即使它们在默认模式下接受它。
您可以使用强制转换
强制转换int *ptr = (int *) &x;
这将消除上述约束违规。编译器现在必须接受你的代码(有一些警告)。但是在修改之后,尝试执行++*ptr
会触发未定义的行为,因为它是尝试修改const
对象。