우리가 흔히
int a = 3;
이런 표현을 쓴다면, 우측의 3은 말 그대로 ( literally ) 상수다.
변하지 않는 값이란 말이지. 고수의 유의어는 아니다. ( 퍽~ )
이런 상수를 literal constant. 리터럴 상수 라고 부른다.
만약 당신이 literal constant 를 선언하고 싶다면, 변수의 선언 표현앞에 const 를 붙여주면 된다.
const int c = 3;
처럼 말이다.
우리는 ( 크기가 고정인 ) 배열의 크기를 표현하기 위해 리터럴 상수를 쓸 수 있고,
int arr[ 5 ];
처럼 표현했다.
따라서 당연히,
const int array_size = 5;
int arr[ array_size ];
도 정상적인 문법이다.
하지만 좀 특이한 경우가 있는데, 우리는 변수를 임시로 고정해서 상수 처럼 쓸 수 있다는 것이다.
int input; // input 은 정수형 변수다.
cin >> input; // 키보드 입력을 통해 값을 얻었다.
int arr[ input ];
이건 당연히 컴파일이 안된다. 컴파일러가 상수가 필요합니다! 하겠지.
그런데,
const int array_size = input;
int arr[ array_size ];
위의 코드처럼 변수를 상수에 보관시켜서 사용하면 어떻게 될까?
GCC 에서는 컴파일이 된다.
VC++ 에서는 컴파일이 되지 않는다.
GCC 가 훨 상수에 대해 유연하다. ( VC++ 은 아직 표준으로 부터 멀고 먼~ )
하지만, GCC 의 경우에도 template 의 인자로 전달할 때는 임시 고정 상수를 사용할 수 없다.
심지어 태생이 리터럴 상수라 하더라도, 전달 과정에 변수를 한 번만이라도 거치면 리터럴 상수 취급을 받지 못한다는 것이다.
( 이건 어쩔 수 없다. 몰래 다른 쓰레드에서 포인터로 전달 과정에 있는 변수를 슥~ 건들면 사실 상수가 아니잖아 )
즉, 나는 상수의 종류를 리터럴 상수와 임시 고정 상수로 정의하되,
GCC 의 경우 임시 고정 상수를 이용한 배열의 크기 설정이 가능하다라고 해석한다.
개념적으로 3단계로 분류해도 되겠지만, 아캄의 면도날 원칙을 따르겠다.
그렇다고 표준 찾아보는것도 따분하니 패스.
컴파일러 마다 사뭇 다를 때, 특정 컴파일러를 대상으로 작성할지,
보다 많은 컴파일러의 식성을 고려해 작성할지는 여러분의 선택이다.
참고.
리러털 상수는, 대표적인 예로 리터럴 문자열 상수 ( "Hello world" 처럼 따옴표로 표기한 문자 그대로의 상수 문자열 )
의 경우와 마찬가지로 실행파일이 실행된 메모리 상의 리터럴 영역에 저장되게 된다.
이 영역은 읽기 전용이다. ( 몇 몇 과거 컴파일러에선 쓰기가 가능한 경우도 있다. )
따라서 런타임에 리터럴 저장소인 메모리에 접근해서 문자열을 바꾸려고 시도하면 런타임 오류를 만나게 된다.
아저씨 상수는 어디에 사용되나요
변하지 않는 숫자를 표현할때요~
철학적으로 이야기 하면 훨~ 복잡해질테지만 ㅋㅋ
아저씨 멋저요
상수는 사물의 상태를 추상화한 snapshot 입니다. 막 요렇게 설명할 꺼리를 무진장 넓힐 수 있음.
어려워영
ㅠㅠ
피에로 // 리터럴이라는 걸 찾아보고 의미를 깨달아보세요 그 다음에 상수와 변수를 구분해보세요
뭐, 사람이 숫자를 발견하게 된게, 들판에 나무가 하나... 하늘에 태양이 하나... 이런 상황 속에서였잖아.
리터럴 이란 말은 "말그대로" 일 뿐입니당~
그런 다음에 자바스크립트를 하면서 뭐 이런 좆같은 초기화 방법이 있어 하고 욕 해 보세요
들판에 나무가 항상 하나라는 보장은 없지. 그 시간속의 그 공간속의 순간을 찰칵~! 찍었을 때 말이 되는 것일 뿐이거든.
그래서 상수를 변수에 대입할 수 있는 것이고, 변수는 본질적으로 상수보다 더 긴 시간의 흐름을 표현하기 위한 것이지.
하지만 상수는 시간이 정지해 있으니까 "항상" 일 뿐.
내 어린시절 추억속의 그 소녀는 항상 소녀인것과 같은 이치.
그래서 snapshot 이란 표현을 쓴것임요.
C99에서는 일반배열로 초기화할 때 변수로 크기를 정할 수 있다고 하던데, 그것 때문 아닐까?
원래 스택에 생성되는 자료형들은 꼭 크기가 고정일 필요는 없어유. 스택 포인터를 걍 원하는 크기만큼 증가시키면 확보 되는거거든.
그걸 과거 컴파일러에선 제약을 많이 걸었지. 왜냐하면 사용할 수 있는 메모리 크기가 코딱지 였기 땜에.
그래서 C/C++ 표준에서 배열의 크기에 대해 융통성이 생겼는데 VC++ 은 열라... 표준 따라오는게 느려. 특히 상수쪽은 아주 꽥임.
난 지금 GCC로 테스트해봤는데 일반변수로도 배열크기를 정할 수 있음 C99표준으로 컴파일을 잡았을 때
ㅇㅇ GCC 는 본질적으로 배열 크기에 관해 변수로 접근할 수 있음을 표현한거임요~
근데 ={0}이렇게 해서 배열 초기화를 할 수 없더라
모든 케이스를 다 아는것 보다 컴파일러로 부터 시비트이지 않을 표현 습관을 가져가는게 정신건강에 이롭다고 보이지유~
비주얼씨뿔은 왜그런거? 되야 맞는거면 왜 수정안해?
그러니 맨날 까이는거지유~
그나마 많이 좋아진게 요정도.
ㅇㅇ//되야->돼야 (되어 = 돼임) [리듬 맞춤법 봇♬]
코세 짱짱맨