안녕하세요
인용문을 넣으면 좋을거같아서 넣어보았습니다.
😘함수의 3단계
함수 정의
: 함수에 대한 내용을 정의하는 것함수 선언
: 함수 사용을 컴파일러에게 알리기 위해 전처리기나 main,특정 함수 안에 쓰는 것함수 호출
: 함수를 사용하기 위해 부르는 것, 매개변수라고 불리는 값을 괄호 안에 넣어 전달한다*함수 선언에 경우, 함수 정의를 상단에 하는 경우 생략이 가능하다.
*함수 호출에서는 인자, 함수 정의 시 사용되는 변수를 매개변수라 부르나 보통 섞어서 쓰기도 한다.
&예시&
#include <stdio.h>
int add(int, int); //1.함수 선언 : 인자에 대한 변수는 생략가능
int main(){
int a = 1;
int b = 2;
printf("%d",add(a,b)); //2.함수 호출 : 인자값 전달
return 0;
}
int add(int n,int m){ //3.함수 정의 : return값은 하나만 가능하다
return n+m;
}
#include <stdio.h>
void apple_cnt(int); //void:데이터없음.
int main(){
int a = 1;
apple_cnt(1);
return 0;
}
void apple_cnt(int a){
printf("I have %d apples",a);
return; //작업을 끝내길 원할때 언제나 끝낼 수 있다.
}
return 값이 없어도되나 값을 필요로 하는 출력에 사용될 수 있다.
#include <stdio.h>
int scan(void);
int main(){
int a[3];
//함수 호출&배열에 각 값을 할당
for(int i=0; i<3; i++){
printf("%d index방 입력 : ",i);
a[i] = scan(); //void는 호출시 사용x
return 0;
}
//전체 출력
for(int i=0; i<3; i++)
printf("%d ,a[i]");
}
int scan(void){
int a;
scanf("%d",&a);
return a;
}
매개값이 필요없을 때 주로 사용한다.
#include <stdio.h>
void hello(void);
int main(){
printf("지금부터 인사 10번 해볼게요 얍!");
for(int i=0; i<10; i++)
hello();
return 0;
}
void hello(void){
printf("Hello!\n");
}
단순 출력에 사용되었다.
자기 자신을 호출해서 사용 후, 조건문을 통해 빠져나온다.
#include <stdio.h>
void apple(void);
int main(){
apple();
return 0;
}
void apple(void){
printf("apple\n");
apple();
}
문제점 분석
1. '재귀'함수이기에, 자신을 계속 부르게된다. -> 끝없는 루프가 이어진다.
2. 위의 코드로는 재귀 함수의 종료 조건을 걸 수 없다.
3. 재귀가 깊고 많아져서 스택 메모리가 초과되는 현상이다. -> 오류 발생 가능성
*스택 메모리- 함수 호출 마다 정보가 쌓이는 메모리.
#include <stdio.h>
void apple(int);
int main(){
apple(1);
}
void apple(int cnt){
if(cnt>10) return 0; //종료를 의미
printf("apple\n");
cnt++;
apple(cnt+1);
}
다음엔 꼬리재귀에 대해서도 알아보고 싶습니다.
헤야할 일
-어떻게 컴파일 최적화가 이루어지는지
-어떤 과정인지
-알고리즘 별로 어떻게 달라지는지