const는 상수 (const int a = 100; 이면 a = 101은 안됨, 100 = 101과 같게 쓴거임
)
여기서 a같은 상수를 r-value
라고 함, 바뀔 수 있는 변수는 l-value
하지만 상수의 값을 바꿀 수 없는건 아님, 그냥 문법상으로만 못바꾼다는거지 만약 포인터를 사용한다면?
주소를 알아내서 아예 메모리에 담긴 값을 바꾸면 값이 바뀜
#include <stdio.h>
int main(void)
{
const int cint = 100;
int* test_cint = (int*)&cint;
*test_cint = 200;
printf("%d", cint);
return 0;
}
이 코드에서는 cint가 200이 됨, 그런데?
출력은 100으로 나오고 로컬에서의 cint 값만 200으로 바뀜
이걸 확인하려면 디버그 모드에서 디스어셈블리로 들어가서 봐야함 (확인해보면 에디터가 상수로 판단하고 있기 때문에 레지스터에 임시로 저장된 값 100을 가져오는거임)
#include <stdio.h>
int main(void)
{
volatile const int cint = 100;
int* test_cint = (int*)&cint;
*test_cint = 200;
printf("%d", cint);
return 0;
}
volatile: 레지스터 최적화 사용하지 않음, 이걸 사용하면 제대로 200이 출력됨
좀 더 자세히 설명하면 이걸 선언하면 최적화를 통해서 레지스터를 사용하지 말고 무조건 이 주소로 이동해서 확인을 하라는 뜻임
원래같으면 const로 선언해놓고 이렇게 강제로 바꾸면 안됨, 그냥 실험용으로 이렇게 된것