1.
#include <stdio.h>
int a;
int main()
{
printf(\"%d\", a);
}
2.
#include <stdio.h>
int a;
int a = 77;
int a;
int main()
{
printf(\"%d\", a);
}
3.
#include <stdio.h>
extern int a;
int main()
{
printf(\"%d\", a);
}
4.
#include <stdio.h>
struct test* a;
int main()
{
printf(\"%d\", sizeof a);
}
직접 프로그램 돌려보지 말고
눈으로 봐서 이중에서 컴파일 되는 코드랑 안되는 코드 구별해보고
컴파일이 된다면 무슨 값이 나올지 예상해봐~ (컴파일이 안된다면 왜 안되는지 생각해보고)
각각 코드마다 \"왜\" 그런 결과가 나오는지 \"정확히\" 안다면 (ANSI C Standard)
C declaration, definition 개념은 제대로 알고있다고 보면 됨.
답:
1. 0
여기서 int a;는 변수 선언(declaration)이지 변수 정의(definition)가 아님.
하지만 컴파일러가 컴파일 할때
전역변수중 (extern이 안붙은) \"declaration\"만 있고 \"definition\"은 찾을수 없는 경우
int a = 0; 처럼 0으로 definition이 있는것으로 취급함 (ANSI C에선 tentative definition이라고 부름)
따라서 int a = 0; 이 있는거나 마찬가지이므로 답은 0.
2. 77
여기서 윗줄과 아랫줄의 int a;는 역시 \"declaration\"이지 \"definition\"이 아님.
하지만 이경우 int a = 77;의 definition이 선언되어 있기 때문에 tentative definition 적용 안되고
그냥 무난히 77 출력.
(변수 선언은 여러번 할수 있지만 변수 정의는 무조건 단 \"하나\"만 존재 할수 있음).
3. 컴파일 에러
이경우는 전역 변수가 extern이 앞에 붙어 있기 때문에 tentative definition이 적용 안되고
그냥 \"declaration\"으로만 취급. 따라서 definition을 찾을수 없는 변수를 사용할려고 하기 때문에 컴파일 에러임.
4. 4
이 문제는 카테고리가 약간 다른데 - _-;; 괜히 넣은듯함.
이 경우 struct test자체가 definition이 없기 때문에 incomplete type임.
하지만 incomplete type을 가르키는 포인터는 선언할수 있고 또한 incomplete type을 가르키는 포인터는
이미 컴파일러가 사이즈를 알고 있기 때문에 sizeof를 사용해도 아무 문제 없음.
(물론 struct test a; sizeof a 이런식으로 incomplete type 자체의 사이즈를 출력할려고 하면 컴파일 에러임).
#include <stdio.h>
int a;
int main()
{
printf(\"%d\", a);
}
2.
#include <stdio.h>
int a;
int a = 77;
int a;
int main()
{
printf(\"%d\", a);
}
3.
#include <stdio.h>
extern int a;
int main()
{
printf(\"%d\", a);
}
4.
#include <stdio.h>
struct test* a;
int main()
{
printf(\"%d\", sizeof a);
}
직접 프로그램 돌려보지 말고
눈으로 봐서 이중에서 컴파일 되는 코드랑 안되는 코드 구별해보고
컴파일이 된다면 무슨 값이 나올지 예상해봐~ (컴파일이 안된다면 왜 안되는지 생각해보고)
각각 코드마다 \"왜\" 그런 결과가 나오는지 \"정확히\" 안다면 (ANSI C Standard)
C declaration, definition 개념은 제대로 알고있다고 보면 됨.
답:
1. 0
여기서 int a;는 변수 선언(declaration)이지 변수 정의(definition)가 아님.
하지만 컴파일러가 컴파일 할때
전역변수중 (extern이 안붙은) \"declaration\"만 있고 \"definition\"은 찾을수 없는 경우
int a = 0; 처럼 0으로 definition이 있는것으로 취급함 (ANSI C에선 tentative definition이라고 부름)
따라서 int a = 0; 이 있는거나 마찬가지이므로 답은 0.
2. 77
여기서 윗줄과 아랫줄의 int a;는 역시 \"declaration\"이지 \"definition\"이 아님.
하지만 이경우 int a = 77;의 definition이 선언되어 있기 때문에 tentative definition 적용 안되고
그냥 무난히 77 출력.
(변수 선언은 여러번 할수 있지만 변수 정의는 무조건 단 \"하나\"만 존재 할수 있음).
3. 컴파일 에러
이경우는 전역 변수가 extern이 앞에 붙어 있기 때문에 tentative definition이 적용 안되고
그냥 \"declaration\"으로만 취급. 따라서 definition을 찾을수 없는 변수를 사용할려고 하기 때문에 컴파일 에러임.
4. 4
이 문제는 카테고리가 약간 다른데 - _-;; 괜히 넣은듯함.
이 경우 struct test자체가 definition이 없기 때문에 incomplete type임.
하지만 incomplete type을 가르키는 포인터는 선언할수 있고 또한 incomplete type을 가르키는 포인터는
이미 컴파일러가 사이즈를 알고 있기 때문에 sizeof를 사용해도 아무 문제 없음.
(물론 struct test a; sizeof a 이런식으로 incomplete type 자체의 사이즈를 출력할려고 하면 컴파일 에러임).
scope개념에 더 가깝겠져.
ㄴ 뭔소리 scope랑 전혀 상관 없음. 변수가 어차피 다 external scope라서.
딱 학교시험문제같은 거네... 개인적으론 왜 이런거에 목숨거는지 모르것더라.
1번 0, 2~4번 컴파일 에러?
1번 0. 2~3번 컴파일에러,4번 4 아냐? 근대 3번은 정확히 몰겠다. 한번 해봐야지.ㅋ
그냥 겉핡기 식으로 프로그래밍 할꺼면 이런거에 목숨걸 필요 없지. 근데 \"제대로\" 프로그래밍 할려면 (물론 위 문제 처럼 완전 이상하게 미묘한건 헷갈리는게 당연하지만) 최소한 변수 선언과 정의의 개념 정도는 어느정도 확실히 잡아 두는게 좋아.