728x90
9.3 함수의 자료형과 반환값
- 2개의 정수를 입력받아 가장 작은 정수를 출력하는 함수
#pragma warning (disable:4996)
#include <stdio.h>
int int_min(int, int);
int main(){
int i1, i2;
while(1){
printf("Input two integers : ");
if(scanf("%d %d",&i1, &i2) != 2) break;
int lesser = int_min(i1, i2);
printf("The lesser of %d and %d is %d\n",i1, i2, lesser);
return 0;
}
printf("End.\n");
}
int int_min(int i1, int i2){
int min; // Local Variable. 이 함수 안에서만 존재하는 변수
if(i1 > i2) min = i2;
else min = i1;
return min; // 함수를 호출한 곳에 min 변수의 값을 돌려보냄(14번 줄)
}
- int형 return type은 생략이 가능하다
- 이는 Compiler가 함수의 반환 자료형이 없을 경우 int로 간주함을 의미
- 단 혼동을 방지하기 위해 자료형은 가능한 생략하지 말 것
- Ctrl + 좌클릭을 통해 함수의 정의 부분으로 이동할 수 있음
- 이러한 단축키들을 익혀두면 코딩 속도를 향상시킬 수 있음
int int_min(int i1, int i2){
int min;
// if(i1 > i2) min = i2;
// else min = i1;
// return min;
return (i1 < i2) ? i1 : i2;
}
- Relational Operator(관계연산자)를 통해 위의 여러 줄을 한 줄로 줄일 수 있음
int int_min(int i1, int i2){
int min;
if(i1 > i2) min = i2;
else min = i1;
return (float)min;
}
- Return 값을 Float로 변환하려 할 시 아래와 같은 Warning 발생
- int 형을 float로 변환하였는데, 경고 창에는 오히려 float을 int로 변환하는 것에 대한 내용이 표시 됨
- 이는 return 형이 int이므로, float로 바꿔 return을 시도하더라도 다시 int로 변환이 됨
- 즉 내부적으로는 아래와 같음
int int_min(int i1, int i2){
... ...
... ...
return (int)((float)min);
}
- int 형을 지워도 위와 동일한 Warning 발생
int int_min(int i1, int i2){
int min;
if (i1 < i2)
return i1;
else
return i2;
printf("Who am I?");
}
- 조건에 따라 함수의 return 값이 달라지는 함수
- 함수에서는 return을 만나면 바로 함수가 종료 됨
- 따라서 맨 아래의 printf문은 절대 실행되지 않음
int int_min(int i1, int i2){
int min;
if (i1 < i2)
return i1;
// else
// return i2;
printf("Who am I?");
}
- 위와 같이 한 분기의 return이 생략될 경우 아래와 같은 Warning이 발생
- 즉 프로그램이 어떤 경로로 실행되던 return을 할 수 있도록 함수를 구현해야 함
int int_min(int i1, int i2){
int min;
if (i1 < i2)
return i1;
else
return i2;
printf("Error Occured");
exit(1);
}
- 혹은 위처럼 오류가 발생했음을 표시할 수 있음
- Return Type이 void가 아닌 함수는 반드시 어떤 값을 Return해야 하는데, 위의 return 문들을 건너 뛰고 아래의 printf문에 도달했다는 것은 어떤 오류가 발생했음을 의미
- 따라서 그 경우 오류가 발생했음을 알리는 역할을 할 수 있음
9.4 변수의 영역과 지역변수
- 변수의 사용 가능 범위에 대한 문법적인 설명
- 변수는 유효한 영역이 정해져 있으며, 그 영역 안에서만 변수를 보고 사용할 수 있다
- 예를 들어, 위처럼 함수 'int_max'에서 선언한 변수 'm'은 함수 int_max에서만 사용할 수 있다
- 즉 변수 'm'이 유효한 범위는 함수 int_max의 블록 안이다
- 이러한 개념이 내부적으로 사용되는 이유는 'Stack Frame' 으로 인함 (추후 설명)
- 즉 함수 안에서 선언이 된 변수들은 그 함수 안에서만 보고 사용할 수 있다
- 볼 수 있다는 것은 코드 상에서 볼 수 있다는 의미
- Ex) int_max 함수에서 선언한 변수 'm'은 main문에서는 볼 수 없다
- 즉 변수를 사용할 수 있는 영역은 그 변수가 선언이 된 영역
- 영역은 C/C++에서는 '{ }' 로 표현
- 위처럼 한 Local에서 선언된 변수는 그 Local 밖에서는 접근이 불가능하다
- 이렇게 함수 등의 지역(Local) 안에서만 사용될 수 있는 변수를 '지역 변수(Local Variable)'라 부른다
- 전체적이 아니라 지역적으로 사용된다는 의미
- 지역 변수의 반대 개념으로는 전역 변수(Global Variable)이 있다
- Global Variable은 File 전체에서 접근과 사용이 가능
- 변수는 Memory 상에서 어떤 공간을 의미하는 명칭
- 프로그래밍 시 메모리의 주소 자체를 직접 다루긴 어려우므로 사람이 인식할 수 있는 언어로써 메모리 상의 주소에 접근
- 결국 변수를 통해 접근하는 것은 메모리 상의 공간에 접근하는 것
- 메모리는 주소를 통해 접근
- 이 때 사용하는 변수의 주소는 아래의 구문을 통해 확인이 가능하다
printf("The address of Variable a is : %p\n", &a);
- 변수 앞에 Ampersand Operator '&'를 붙여 변수의 주소를 받아옴
- Ampersand Operator '&'는 변수의 주소를 알려주는 Operator
- Printf문 내의 'p'는 Pointer Type을 의미
#pragma warning (disable:4996)
#include <stdio.h>
int int_max(int, int);
int int_max(int i, int j) {
int m;
m = i > j ? i : j;
return m;
}
int main() {
int a;
a = int_max(1, 2);
printf("%d\n", a);
printf("%p\n", &a);
{
// 새로운 지역
a = int_max(4, 5);
printf("%d\n", a);
printf("%p\n", &a);
}
printf("%d\n", a);
printf("%p\n", &a);
}
- main 문에서 선언된 변수 'a'를 총 3번에 걸쳐 출력
- 코드 실행 결과
- 3개의 주소값이 모두 동일 : 모두 같은 변수
- 즉 위의 서로 다른 지역에 있는 3개의 a는 모두 같은 변수
#pragma warning (disable:4996)
#include <stdio.h>
int int_max(int, int);
int int_max(int i, int j) {
int m;
m = i > j ? i : j;
return m;
}
int main() {
int a;
a = int_max(1, 2);
printf("%d\n", a);
printf("%p\n", &a);
{
int a; // 안쪽 영역에서 이름이 동일한 변수를 하나 더 선언
a = int_max(4, 5);
printf("%d\n", a);
printf("%p\n", &a);
}
printf("%d\n", a);
printf("%p\n", &a);
}
- 안쪽 영역에서 'a'를 다시 선언
- 주소가 달라짐
- 안쪽 영역에서 선언된 변수 'a'는 바깥쪽의 변수와 다른 변수임
- 바깥쪽의 'a'는 서로 같은 변수
- 안쪽의 'a'는 안쪽에서만 사용
- 위처럼 한 변수가 여러 영역에서 선언될 경우, 해당 변수는 지역에서 새로 선언된 변수로 바뀜
강의 출처 : https://www.inflearn.com/course/following-c
'Study_C, C++ > 홍정모의 따라하며 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 9.1 함수가 필요할 때 ~ 9.2 함수의 프로토타입 (0) | 2022.05.29 |
---|---|
[홍정모의 따라하며 배우는 C언어] 8.9 텍스트 파일 읽기 (0) | 2022.03.23 |
[홍정모의 따라하며 배우는 C언어] 8.8 메뉴 만들기 예제 (0) | 2022.03.19 |
[홍정모의 따라하며 배우는 C언어] 8.7 입력 스트림과 숫자 (0) | 2022.03.07 |
[홍정모의 따라하며 배우는 C언어] 8.6 입력 확인하기 (0) | 2022.03.06 |