C 为什么这段代码在更改常量整数时起作用?

C 为什么这段代码在更改常量整数时起作用?,c,C,如果i是常量,那么即使通过指针也不应该改变它。如果不是,它不改变的条件是什么 编译器应在下一行警告丢失const int const i = 10; int *j = &i; *j = 20; printf("%d",i); 所以const的工作原理与此完全相同,它只是防止您意外地更改const变量,因为您会在使用它之前先听取编译器并修复代码 但是,您不能直接分配给i 但是,通过指针,您始终可以摆脱常量const。无论结果行为是否已定义,在您删除const之前,您都应该知道这一点,这有

如果i是常量,那么即使通过指针也不应该改变它。如果不是,它不改变的条件是什么

编译器应在下一行警告丢失
const

int const i = 10;
int *j = &i;
*j = 20;
printf("%d",i);
所以
const
的工作原理与此完全相同,它只是防止您意外地更改
const
变量,因为您会在使用它之前先听取编译器并修复代码

但是,您不能直接分配给
i

但是,通过指针,您始终可以摆脱常量
const
。无论结果行为是否已定义,在您删除
const
之前,您都应该知道这一点,这有时是很好的,但是如果您必须这样做,这可能意味着您有设计问题。

编译器应在下一行警告丢失
const

int const i = 10;
int *j = &i;
*j = 20;
printf("%d",i);
所以
const
的工作原理与此完全相同,它只是防止您意外地更改
const
变量,因为您会在使用它之前先听取编译器并修复代码

但是,您不能直接分配给
i


但是,通过指针,您始终可以摆脱常量
const
。无论结果行为是否定义,在您删除
const
之前,您都应该知道这一点,这有时是很好的,但是如果您必须这样做,这可能意味着您有一个设计问题。

编译器应该为这一行发出警告:
int*j=&i。使非常量限定指针指向常量限定对象

稍后尝试通过
j
指针修改
i
时,行为未定义:

  • 如果
    i
    是可写的,它可能会被修改,这就是您观察到的
  • 但是,如果在文件范围中定义了
    i
    ,编译器可能会将其定位在只读段中,并且尝试可能会因段错误而失败
  • 其他任何事情都有可能发生,包括总统垮台
请尝试编译并运行此程序:

int *j = &i;
#包括
int const i=10;
内部主(空){
int*j=&i;
*j=10;
printf(“%d\n”,i);
返回0;
}

编译器应该为此行发出警告:
int*j=&i。使非常量限定指针指向常量限定对象

稍后尝试通过
j
指针修改
i
时,行为未定义:

  • 如果
    i
    是可写的,它可能会被修改,这就是您观察到的
  • 但是,如果在文件范围中定义了
    i
    ,编译器可能会将其定位在只读段中,并且尝试可能会因段错误而失败
  • 其他任何事情都有可能发生,包括总统垮台
请尝试编译并运行此程序:

int *j = &i;
#包括
int const i=10;
内部主(空){
int*j=&i;
*j=10;
printf(“%d\n”,i);
返回0;
}


编译器没有警告您此初始化
int*j=&i?我希望它会发出这样的问题:“警告:初始化从指针目标类型丢弃'const'限定符”未定义的行为是未定义的。不是这样的:(编译器没有警告您此初始化
int*j=&I;
?我希望它发出这样的问题:“警告:初始化从指针目标类型中丢弃'const'限定符”未定义的行为未定义。不是这样:(我喜欢你描述潜在灾难的方式。在现在的美国,总统垮台不需要归咎于糟糕的行为准则。@aschepler:也许是糟糕的行为准则?或者是投票机中的糟糕代码?@aschepler真的吗?我浪费了我所有的时间写糟糕的代码,但没有达到预期的效果?我喜欢你描述潜在灾难的方式isaster.在现在的美国,总统的垮台不需要归咎于糟糕的代码。@aschepler:也许是糟糕的行为规范?或者是投票机中的糟糕代码?@aschepler真的吗?我浪费了所有的时间写糟糕的代码,却没有达到预期的效果?(
int*j=&i;
,带有警告的那一行,是一个初始化,而不是赋值。)@aschepler是真的,但这两种情况下都是同一个问题。我想我现在对警告的回答更清楚了。(
int*j=&i;
,带有警告的那一行,是一个初始化,而不是赋值。)@是的,但这两种情况下的问题都是一样的。我想我的答案现在更清楚了。