왜 이것이 작동하는지 이해할 수 없습니다.왜 const int는 scanf를 사용하여 변경할 수 있습니까?
#include<stdio.h>
void main(){
const int x = 100;
printf("x = %d \n",x);
scanf("%d",&x); //working fine
printf("x = %d \n",x); //prints the new value
}
왜 이것이 작동하는지 이해할 수 없습니다.왜 const int는 scanf를 사용하여 변경할 수 있습니까?
#include<stdio.h>
void main(){
const int x = 100;
printf("x = %d \n",x);
scanf("%d",&x); //working fine
printf("x = %d \n",x); //prints the new value
}
const 변수를 수정하면 정의되지 않은 동작입니다. 어떤 일이든 일어날 수있다. GCC와 -Wall
를 사용
, 당신은 볼 수 있습니다 :
경고 : (ARG 2)
그것은 UB는 일반적으로 상수 객체로 작성.
사례에 캐스팅 결과가 표시 될 수 있습니다. 예를 들어
:
void main(void)
{
int const x = 100;
int *x2 = &x;
*x2 = 2;
}
내 컴퓨터에 노력하고 있습니다 만,
void main(void)
{
int const x = 100;
x = 2;
}
는 (컴파일 에러)가 아닙니다.
어쨌든 const 변수를 변경하지 않는 것이 좋습니다.
변경할 수 있지만 동작은 정의되지 않았습니다. 표준에서 언급했듯이! 6.7.3
아래 C11에서
그 시도가 아닌 CONST 수식 유형 좌변의 사용을 통해 CONST 수식 유형 정의 된 객체를 변경하게되면, 동작은 정의되지 . 비 휘발성 한정 유형의 lvalue를 사용하여 volatile 정의 된 유형으로 정의 된 객체를 참조하려고하면 해당 동작은 정의되지 않습니다.