#include <stdio.h>
// [리턴타입] [함수이름]([인자_데이터형] [변수명1], [인자_데이터형] [변수명2] ... )
int abc(int a, int b)
{
return a + b;
}
// 리턴타입이 없다 = void, 파라미터 없으면 void 혹은 공백
void xyz()
{
return;
}
int main()
{
int result;
result = abc(2, 3);
return 0;
}
함수의 선언 => void func1();
: 중괄호 없이 : 로 끝나면 선언
함수의 정의 => void func2() { }
: 중괄호 있으면 정의
정의는
중복
이 허용되지 않지만, 선언은중복
이 허용된다.
Parameter : 전달인자
Argument : 실행인자
#include <stdio.h>
int abc(int a, int b) // a, b는 parameter
{
return a+b;
}
int main()
{
int result;
result = abc(2, 3); // 2, 3 은 argument
return 0;
}
함수의 리턴할 수 있는 값은 오로지 1개
이다.
리턴값을 여러개 보내는 방법은?
#include <stdio.h>
int x;
int y;
int z;
void add(int a, int b)
{
x = a;
y = b;
z = a + b;
return;
}
int main()
{
add(2, 3);
printf("%d %d %d", x, y, z); // 2 3 5
return 0;
}
#include <stdio.h>
typedef struct _val_t // 구조체 정의
{
int a;
int b;
}val_t;
val_t abc()
{
val_t node; // 구조체 선언
// 구조체에 값 넣기
node.a = 20;
node.b = 30;
return node; // 구조체 반환
}
int main()
{
val_t get; // 구조체 선언
get = abc(); // 반환된 구조체 변수의 내용이 get으로 모두 복사됨
printf("%d %d", get.a, get.b); // 20 30
return 0;
}
#include <stdio.h>
void abc(int* a, int* b)
{
*a = 10;
*b = 20;
return;
}
int main()
{
int num1 = 100;
int num2 = 200;
abc(&num1, &num2);
printf("%d %d\n", num1, num2); // 10 20
return 0;
}
C언어에서 함수는 서로 평등
한 관계, 서로서로 호출이 가능하다.
다음 오류가 발생하는 코드를 보고 어디서 오류가 발생하는지 살펴보자
#include <stdio.h>
void abc()
{
def(); // 여기서 에러 발생
return;
}
void def()
{
abc();
return;
}
int main()
{
abc();
def();
return 0;
}
컴파일러는 위에서
부터 차례차례 읽는다. abc함수 입장에서는 def함수는 정의되지 않는
것처럼 생각하기 때문입니다.
#include <stdio.h>
void def() // def 함수를 abc 함수보다 위에 정의해주기
{
// abc();
return;
}
void abc()
{
def();
return;
}
int main()
{
abc();
def();
return 0;
}
이렇게 abc() 함수 위에 사용하려는 def()를 정의시켜준다. 하지만, 이는 좋은 방법이 아닙니다. 코드가 길어지면 유지보수
가 하기가 매우 어렵고, def()함수 입장
에서는 abc()
를 사용하지 못한다.
#include <stdio.h>
void def(); // def 함수 선언, 선언은 중복이 허용된다.
void abc()
{
def();
return;
}
void def()
{
abc();
return;
}
int main()
{
abc();
def();
return 0;
}
다음과 같이 사용하면 abc() 함수에서 def() 사용 가능 하고, def() 함수에서 abc() 함수 사용가능하다.