static이 file scope이란건 잘 알겠습니다.
그런데 return type이 const라는 부분이 잘 이해가 안갑니다.
return된 값을 변경할 수 없다는 말인가요?
예를 들어
const int a;
const static int function();
a = function();
이 경우 function()의 return 값을 받는 const int a가
값을 받은 이후 변경되어서는 안된다는 말인가요?
static이 file scope이란건 잘 알겠습니다.
그런데 return type이 const라는 부분이 잘 이해가 안갑니다.
return된 값을 변경할 수 없다는 말인가요?
예를 들어
const int a;
const static int function();
a = function();
이 경우 function()의 return 값을 받는 const int a가
값을 받은 이후 변경되어서는 안된다는 말인가요?
예가 잘못되었습니다. a 가 const int 형으로 선언되었으므로, a 에 초기화
가 아닌 방법으로 값을 대입할 수는 없습니다. 직접 실행해보시면 쉽게
그 결과를 알 수 있을 겁니다.
const 는 형한정어 (type qualifier) 이고, 형한정어는 정의상 lvalue
문맥에서만 유효합니다. 함수 반환값은 lvalue 가 아니므로 함수 반환형에
붙는 const 는 무의미합니다 - 다만, 함수형의 호환 여부 결정에는 영향을
미칩니다.
int a; /* "just" INT */
const int foo(); /* function returning (const) INT */
int foo(); /* not compatible with the above; wrong */
a = foo(); /* no problem */
고로 함수 반환형에 const 나 volatile 을 사용하는 것은 의미 없이
프로그램을 복잡하게 만드는 것 뿐입니다.
물론, 어떤 함수가 포인터를 반환하고 형한정어가 포인터 값이 아닌
포인터를 한정하는데 사용한다면 이야기가 달라집니다.
int *pi; /* POINTER TO INT */
const int *foo(); /* function returning POINTER TO CONST INT */
pi = foo(); /* wrong */
비교를 위해 포인터가 관련된 예를 처음 보였던 예와 유사하게 바꾸면,
int *pi; /* "just" POINTER TO INT */
int * const foo(); /* function returning (const) POINTER TO INT */
pi = foo(); /* no problem */
제가 주석에 대문자로 쓴 부분을 위 아래 예에서 비교해보시면 그 차이가
더 분명해 질 것입니다.
C 언어의 type system 은 말로 풀어 설명할 경우 혼란스러울 수 있지만
수학 공식을 이해하듯 그 기본적인 규칙을 차근히 따라가면 아무리 복잡한
경우도 기계적으로 받아들일 수 있습니다.
C++ 의 멤버가 아닌 C 에서 말씀하시는 거죠?const 는 f
C++ 의 멤버가 아닌 C 에서 말씀하시는 거죠?
const 는 function을 수식하지 않고 return type을 수식합니다.
static 은 function의 scope를 제한 합니다. 즉 file 단위로 제한합니다.
맨 위 검색이라는 조그마한 버튼을 이용해서 검색한번 해보시면 더 좋은 글들을 얻을 수 있습니다
---
http://coolengineer.com
답변 감사드립니다.검색을 해봤는데도 쉽게 이해가 잘 안가서요...
답변 감사드립니다.
검색을 해봤는데도 쉽게 이해가 잘 안가서요...
static이 file scope이란건 잘 알겠습니다.
그런데 return type이 const라는 부분이 잘 이해가 안갑니다.
return된 값을 변경할 수 없다는 말인가요?
예를 들어
const int a;
const static int function();
a = function();
이 경우 function()의 return 값을 받는 const int a가
값을 받은 이후 변경되어서는 안된다는 말인가요?
네.. 맞습니다.a 값은 바뀔 수 없는 것이죠.
네.. 맞습니다.
a 값은 바뀔 수 없는 것이죠.
---
http://coolengineer.com
[quote="perihk"]답변 감사드립니다.검색을 해봤는데도 쉽게
예가 잘못되었습니다. a 가 const int 형으로 선언되었으므로, a 에 초기화
가 아닌 방법으로 값을 대입할 수는 없습니다. 직접 실행해보시면 쉽게
그 결과를 알 수 있을 겁니다.
const 는 형한정어 (type qualifier) 이고, 형한정어는 정의상 lvalue
문맥에서만 유효합니다. 함수 반환값은 lvalue 가 아니므로 함수 반환형에
붙는 const 는 무의미합니다 - 다만, 함수형의 호환 여부 결정에는 영향을
미칩니다.
고로 함수 반환형에 const 나 volatile 을 사용하는 것은 의미 없이
프로그램을 복잡하게 만드는 것 뿐입니다.
물론, 어떤 함수가 포인터를 반환하고 형한정어가 포인터 값이 아닌
포인터를 한정하는데 사용한다면 이야기가 달라집니다.
비교를 위해 포인터가 관련된 예를 처음 보였던 예와 유사하게 바꾸면,
제가 주석에 대문자로 쓴 부분을 위 아래 예에서 비교해보시면 그 차이가
더 분명해 질 것입니다.
C 언어의 type system 은 말로 풀어 설명할 경우 혼란스러울 수 있지만
수학 공식을 이해하듯 그 기본적인 규칙을 차근히 따라가면 아무리 복잡한
경우도 기계적으로 받아들일 수 있습니다.
그럼...
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기