함수를 정의하고 호출하는 소스 코드
argument/parameter, 리턴값
#include <iostream>
int up(int x) {
return x + 1;
}
int main() {
int result = up(3); // 함수 호출
std::cout << "Result: " << result << std::endl; // 결과 출력
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
void display() {
printf("안녕");
}
int main() {
printf("Hi");
display();
return 0;
}
↑ int main에서 "Hi"라는 문자열을 출력하고 display()함수를 호풀하여 "안녕"을 출력
출력결과 = Hi 안녕
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (2) : 두 배 해서 출력하는 함수
#include <stdio.h>
void double_number(int x) {
printf("%d", x * 2);
}
int main() {
double_number(3);
return 0;
}
정수 3을 두 배로 계산해서 6을 출력하는 프로그램(x의 값 2배)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (3) : 두 배 해서 리턴하는 함수
#include <stdio.h>
int double_number(int x)
{
return x * 2;
}
int main() {
int x;
x = double_number(3);
printf("%d", x);
return 0;
}
출력 결과
정수 3을 두 배로 계산하여 결과를 변수 x에 저장하고, 그 값을 출력하는 C 프로그램
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (4) : 두 수를 더해서 리턴하는 함수
#include <stdio.h>
int add(int x, int y) {
return x + y;
}
int main() {
int x;
x = add(2, 3);
printf("%d", x);
return 0;
}
두 정수 2와 3을 더하여 결과를 출력하는 C 프로그램
add 함수는 두 개의 정수 x와 y를 받아서 그 합을 반환
main 함수에서 add(2, 3)을 호출하여 2와 3의 합인 5를 x에 저장하고, printf를 사용하여 그 값을 출력
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (5) : 문자 리턴 자판기 함수
#include <stdio.h>
char vending(int x)
{
if (x == 1) return 'A';
else return 'B';
}
int main()
{
char x;
x= vending(1);
printf("%c\n", x);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
char vending(int x)
{
if (x == 1) return 'A';
else return 'B';
}
int main()
{
char x;
x = vending(1);
printf("%c\n", x); // 'A'가 출력됨
return 0;
}
입력된 정수에 따라 'A' 또는 'B'를 반환하는 자판기 함수를 구현하고, 그 결과를 출력
함수 정의: vending 함수는 정수 x를 받아서 x가 1일 경우 'A'를 반환하고, 그렇지 않으면 'B'를 반환
main 함수: main 함수에서 vending(1)을 호출하여 반환된 값을 x에 저장하고, printf를 사용하여 그 값을 문자 형식으로 출력
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (6) : 문자열 리턴 자판기 함수1
#include <stdio.h>
const char* vending(int x)
{
if (x == 1) return "커피";
else return "유자차";
}
int main()
{
const char* x;
x = vending(1);
printf("%s\n", x);
return 0;
}
const char형으로 함수를 정의하고 x값이 1이면 커피, 그 외 값이면 유자차로 저장하고, x라는 값에 저장
함수에 1을 써서 커피로 저장되고 출력되었기 때문에
출력 결과 = 커피
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (6) : 문자열 리턴 자판기 함수2
#include <iostream>
using namespace std;
const char* vending(int x) // const char 대신 string도 가능
{
if (x == 1) return "커피";
else return "유자차";
}
int main() {
cout << vending(1);
return 0;
}
위의 코드들을 c++ 스타일로 변경
문자열 리턴 자판기 함수1
#include <iostream>
using namespace std;
const char* vending(int x)
{
if (x == 1) return "커피";
else return "유자차";
}
int main()
{
cout<<vending(1);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문자열 리턴 자판기 함수2
#include <stdio.h
>
//void view(void); //함수 선언 또는 원형
int main(void)
{
printf("메인함수: view 호출 전\n");
view(); //함수 호출
printf("메인함수: view 호출 후\n");
return 0;
}
void view(void) //함수 정의
{
printf("view 함수\n");
}
위 소스코드의 경우 주석처리 된 void view(void);를 주석 해제 하면 작동한다.
그 이유는 사용자 설정 함수인 view가 정의는 되어있으나 정의를 먼저 하지 않고
호출을 하려고 했기 때문에 오류에도 "error C3861: 'view': 식별자를 찾을 수 없습니다."
라는 오류를 나타내며 디버깅 실패를 하게 된다.
따라서 아래처럼 하는것이 정석적인 함수의 선언,호출,정의 라고 볼 수 있다.
#include <stdio.h>
void fun1(void); //함수 선언 또는 원형
void fun2(void); //함수 선언 또는 원형
int main(void)
{
printf("메인 함수 전\n");
fun1(); //함수 호출
fun2(); //함수 호출
printf("메인 함수 후\n");
return 0;
}
void fun1(void) //함수 정의
{
printf("fun1()\n");
}
void fun2(void) //함수 정의
{
printf("fun2()\n");
}
출력 결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (1) : 전광판 함수 선언해보기
#include <stdio.h>
void display() // 함수 정의
{
printf("안녕");
}
int main()
{
display(); // 함수 호출
return 0;
}
#include <stdio.h>
void display(); // 함수 선언
int main()
{
display(); // 함수 호출
return 0;
}
void display() // 함수 정의
{
printf("안녕");
}
두 개의 소스코드의 실행결과는 같으나, 정의를 먼저 하느냐, 선언을 하고 메인함수 뒤에 정의를 하느냐 차이
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (2) : 두 배 해서 출력하는 함수 선언해보기
#include <stdio.h>
void print_double_number(int x)
{
printf("%d",x*2);
}
int main()
{
print_double_number(3);
return 0;
}
의 코드를
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
// 정수를 두 배로 출력하는 함수
void print_double_number(int x) {
cout << x * 2; // x의 두 배를 출력
}
int main() {
print_double_number(3); // 3의 두 배를 출력
return 0; // 프로그램 종료
}
c++스타일로 변경
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (3) : 두 배 해서 리턴하는 함수 선언해보기
#include <stdio.h>
int double_number(int x)
{
return x*2;
}
int main()
{
int x;
x = double_number(3);
printf("%d\n", x);
printf("%d\n", double_number(3));
return 0;
}
이 코드를
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
// 주어진 정수를 두 배로 반환하는 함수
int double_number(int x) {
return x * 2; // x의 두 배를 반환
}
int main() {
int x; // 정수형 변수 x 선언
x = double_number(3); // double_number 함수 호출하여 3의 두 배를 x에 저장
cout << x << endl; // x의 값 출력 (6)
cout << double_number(3) << endl; // double_number 함수 호출하여 3의 두 배를 바로 출력
return 0; // 프로그램 종료
}
c++ 스타일로 변경
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (4) : 두 수를 더해서 리턴하는 함수 선언해보기
#include <stdio.h>
int add(int x, int y)
{
return x + y ;
}
int main()
{
int x;
x=add(2, 3);
printf("%d", x);
return 0;
}
이 코드를
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
// 두 정수를 더하여 반환하는 함수
int add(int x, int y) {
return x + y; // x와 y의 합을 반환
}
int main() {
int x; // 정수형 변수 x 선언
x = add(2, 3); // add 함수 호출하여 2와 3의 합을 x에 저장
cout << x << endl; // x의 값을 출력 (5)
return 0; // 프로그램 종료
}
c++ 스타일로 변경
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 5 : 자판기 함수 선언해보기
#include <stdio.h>
char vending(int x)
{
if (x == 1) return 'A';
else return 'B';
}
int main()
{
char x;
x= vending(1);
printf("%c\n", x);
return 0;
}
이 코드를
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
// 주어진 정수에 따라 'A' 또는 'B'를 반환하는 함수
char vending(int x) {
if (x == 1) return 'A'; // x가 1일 경우 'A' 반환
else return 'B'; // 그 외의 경우 'B' 반환
}
int main() {
char x; // 문자형 변수 x 선언
x = vending(1); // vending 함수 호출하여 1에 대한 결과를 x에 저장
cout << x << endl; // x의 값을 출력 ('A')
return 0; // 프로그램 종료
}
c++ 스타일로 변경
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
함수 만들기 (6) : 자판기 함수 선언해보기
#include <stdio.h>
const char* vending(int x)
{
if (x == 1) return "커피";
else return "유자차";
}
int main()
{
printf("%s\n", vending(1));
return 0;
}
이 코드를
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
// 주어진 정수에 따라 "커피" 또는 "유자차" 문자열을 반환하는 함수
const char* vending(int x) {
if (x == 1) return "커피"; // x가 1일 경우 "커피" 반환
else return "유자차"; // 그 외의 경우 "유자차" 반환
}
int main() {
cout << vending(1) << endl; // vending 함수 호출하여 결과 출력 ("커피")
return 0; // 프로그램 종료
}
c++ 스타일로 변경
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int add(int x, int y);//함수 선언
//int add(int,int);처럼 매개변수명은 생략 가능
int main(void)
{
int sum;
printf("메인 함수\n");
add(5, 10); //함수를 호출하고 리턴값을 보관하지 않음
//15가 리턴되었지만 사라짐
sum = add(5, 10); //함수 호출 후 리턴 값을 sum에 저장
printf("sum=%d\n", sum);
printf("add(5,10)=%d\n", add(5, 10));//함수 호출 후 리턴값을 바로 출력
return 0;
}
int add(int x, int y) //함수 정의
{ // x에 5, y에 10이 넘어옴
int z;
z = x + y;
return(z); //위 세 줄 대신 return(x+y); 라고만 써도 됨
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h> // 표준 입출력 라이브러리 포함
int sum(int n); // 함수 선언
int main(void) {
int in = 3, out; // 입력과 출력을 위한 변수 선언
out = sum(in); // sum 함수 호출
printf("\nin=%d, out=%d\n", in, out); // 결과 출력
return 0; // 프로그램 종료
}
int sum(int n) {
printf("n=%d ", n); // n의 값 출력
if (n <= 1)
return 1; // n이 1 이하일 경우 1 반환
else
return n + sum(n - 1); // n과 sum(n-1)의 합 반환
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int sum(int n);
int main(void)
{
int in, out;
for (in = 1; in <= 50000; in++) {
out = sum(in);
printf("in=%d,out=%d\n", in, out);
}
return 0;
}
int sum(int n)
{
if (n <= 1) return(1);
else return(n + sum(n - 1));
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int add(int x, int y);
int main(void)
{
int sum;
sum=add(5,10);
//함수를 호출할 때 사용하는 매개변수인 5와 10은 실매개변수, argument
}
int add(int x, int y) //함수 정의시 사용하는 x와 y는 형식매개변수, parameter
{ //x에 5, y에 10이 전달됨
return(x+y);
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int sum(int a, int b); //함수 선언
int main(void)
{
int a = 2, b = 5, result;
double da = 2.5, db = 5.2;
result = sum(2, 5);
printf("%d\n", result);
result = sum(a, b);
printf("%d\n", result);
result = sum(2.5, 5.2);
printf("%d\n", result);
result = sum(da, db);
printf("%d\n", result);
return 0;
}
int sum(int a, int b)
{
return(a + b);
}
출력결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int sum(int x, int y);
int main(void)
{
int a = 2, b = 5, c=0;
printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);
c = sum(a, b);
printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c); //2,5,14
return 0;
}
int sum(int a, int b)
{
a = a + 2;
b = b + 5;
printf("sum()함수 내 a=%d b=%d a+b=%d\n", a, b, a + b);
return(a + b);
}
출력결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
call by reference의 예시
//&연산자 예
#include <stdio.h>
int main(void)
{
int a=10, b=20;
printf("변수 a의 값=%d, 주소=%p\n",a, &a);
printf("변수 b의 값=%d, 주소=%p\n",b, &b);
return 0;
}
출력결과
#include <stdio.h>
int sum(int *pa, int *pb);
int main(void)
{
int a = 2, b = 5, c=0;
printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);
c = sum(&a, &b);
printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c);
//4,10,14
return 0;
}
int sum(int *pa, int *pb)
{//a의 주소가 포인터 pa로 전달됨
*pa = *pa + 2;
*pb = *pb + 5;
return(*pa + *pb);
}
출력결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
반복되는 부분은 함수로 구현
#include <stdio.h>
int main(void)
{
int num1=1,num2=2,num3=3;
int num4=4,num5=5,num6=6;
int sum;
sum=num1+num2;
printf("두 수 %d과 %d를 더한 결과는 %d입니다.\n",num1, num2, sum);
sum=num3+num4;
printf("두 수 %d과 %d를 더한 결과는 %d입니다.\n",num3, num4, sum);
sum=num5+num6;
printf("두 수 %d과 %d를 더한 결과는 %d입니다.\n",num5, num6, sum);
return 0;
}
이 코드를
#include <stdio.h>
void add(int x, int y);
int main(void)
{
int num1 = 1, num2 = 2, num3 = 3;
int num4 = 4, num5 = 5, num6 = 6;
add(num1, num2);
add(num3, num4);
add(num5, num6);
return 0;
}
void add(int x, int y)
{
printf("두 수 %d과 %d를 더한 결과는 %d입니다.\n", x, y, x + y);
}
함수로 구현해서 훨씬 보기 편하게 변경
출력 결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
모듈화 프로그래밍 연습 : 모듈화 전
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> // 표준 입출력 라이브러리 포함
#include <limits.h> // INT_MIN, INT_MAX 정의 포함
int main(void) {
int i, num, sum = 0, total;
int max = INT_MIN; // max는 int형으로 표현할 수 있는 가장 작은 값으로 초기화
int min = INT_MAX; // min은 int형으로 표현할 수 있는 가장 큰 값으로 초기화
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 임의의 개수의 수의 합, 평균, 최대값, 최소값을 구하는 프로그램 ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("계산하려는 수는 몇 개입니까=>");
scanf("%d", &total);
for (i = 1; i <= total; i++) {
printf("%d번째 수를 입력하세요=", i);
scanf("%d", &num);
sum += num; // 합계 계산
max = (num > max) ? num : max; // 최대값 갱신
min = (num < min) ? num : min; // 최소값 갱신
}
printf("합:%d 평균:%.2f 최댓값:%d 최솟값:%d\n", sum, (double)sum / total, max, min);
return 0; // 프로그램 종료
}
출력결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
모듈화 프로그래밍 연습 : 모듈화 후
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <limits.h>
void start(void); // 함수 선언
int max_number(int a, int b); // 함수 선언
int min_number(int a, int b); // 함수 선언
int main(void) {
int i, num, sum = 0, total;
int max = INT_MIN, min = INT_MAX;
start(); // 함수 호출
printf("계산하려는 수는 몇 개입니까=> ");
scanf("%d", &total);
for (i = 1; i <= total; i++) {
printf("%d번째 수를 입력하세요= ", i);
scanf("%d", &num);
sum += num; // 합계 계산
max = max_number(num, max); // 최대값 함수 호출
min = min_number(num, min); // 최소값 함수 호출
}
printf("합:%d 평균:%.2f 최대값:%d 최소값:%d\n",
sum, (double)sum / total, max, min);
return 0; // 프로그램 종료
}
void start(void) { // 함수 정의
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 합, 평균, 최대값, 최소값 ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
int max_number(int a, int b) { // 함수 정의
return (a > b) ? a : b; // a와 b 중 더 큰 값 반환
}
int min_number(int a, int b) { // 함수 정의
return (a < b) ? a : b; // a와 b 중 더 작은 값 반환
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
소스를 헤더 파일(.h)과 C 파일(.c)로 나누기
#include "score.h"
int main(void)
{
int i, num, sum = 0, total;
int max = INT_MIN, min = INT_MAX;
start();//함수호출
printf("계산하려는 수는 몇개입니까=>");
scanf("%d", &total);
for (i = 1; i <= total; i++) {
printf("%d번째 수를 입력하세요=", i);
scanf("%d", &num);
sum += num;
max = max_number(num, max);//함수 호출
min = min_number(num, min);//함수 호출
}
printf("합:%d 평균:%.2f 최대값:%d 최소값:%d\n",
sum, (double)sum / total, max, min);
return 0;
}
void start(void)//함수정의
{
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 합, 평균, 최대값, 최소값┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
}
int max_number(int a, int b)//함수정의
{
return((a > b) ? a : b);
}
int min_number(int a, int b)//함수정의
{
return((a < b) ? a : b);
}
main 함수 윗부분의 표준 라이브러리 함수들을 불러오는 부분과 함수 선언을 하던 부분이 한 줄로 정리됨
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
지역(local) 변수와 전역(global) 변수 예시
#include <stdio.h>
void show(void);
int x; //전역 변수
//정적데이터영역에 저장
int main(void)
{
int y;//지역 변수
//스택에 저장
}
void show(void)
{
int z;//지역 변수
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
지역 변수의 유효범위
#include <stdio.h>
int main(void) {
int k = 10; // 지역 변수 k를 10으로 초기화
printf("%d ", k); // 10 출력
{
int k = 20; // 새로운 지역 변수 k를 20으로 초기화
k += 10; // k에 10을 더함 (k는 30)
printf("%d ", k); // 30 출력
}
k += 5; // 바깥쪽 k에 5를 더함 (k는 15)
printf("%d ", k); // 15 출력
return 0; // 프로그램 종료
}
지역 변수는 스택에 일시적으로 저장되며 선언된
블록( { } ) 내에서만 접근 가능하고 유효함
출력 결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
main()함수와 add()함수의 x, y 예시
#include <stdio.h>
int add(int x, int y); // 함수 선언
int main(void) {
int x = 5, y = 10, sum; // 변수 x, y, sum 선언 및 초기화
printf("add()함수 호출 전 메인 함수 x=%d, y=%d\n", x, y); // x와 y 출력
sum = add(x, y); // 함수 호출 (값에 의한 호출), 리턴된 값을 sum에 저장
printf("sum=%d\n", sum); // sum 출력
printf("add()함수 호출 후 메인 함수 x=%d, y=%d\n", x, y); // x와 y 출력
return 0; // 프로그램 종료
}
int add(int x, int y) { // 함수 정의
printf("add()함수 내부 1 x=%d, y=%d\n", x, y); // 함수 내 x와 y 출력
x = x + 5; // x에 5를 더함
y = y + 5; // y에 5를 더함
printf("add()함수 내부 2 x=%d, y=%d\n", x, y); // 수정된 x와 y 출력
return x + y; // x와 y의 합 반환
}
main 함수 안에 있는 int x,y는 5와 10,
add 함수내의 x와 y는 5씩 각각 더해짐.
= add 함수 내부의 x와 y는 총 10과 15, 출력해본다면 main 함수 내에선 여전히 x와 y는 5와 10
출력 결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
auto변수 예
#include <stdio.h>
int main(void)
{
auto int a=1; //여기서 auto는 생략가능
{
int a=2; //auto 변수
{
int a=3; //auto 변수
printf("%d ",a);
}
printf("%d ",a);
}
printf("%d ",a);
return 0;
}
auto변수: 함수나 블록을 진입하면기억 영역이 확보되고,벗어나면 기억 영역은바로 소거됨
출력결과
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
void sub(void);
int main(void)
{
sub();
sub();
sub();
return 0;
}
void sub(void)
{
auto int x=10; //auto는 생략가능
static int y=10; //실행시 이 문장은 실행하지 않음, 컴파일시 이미 결정됨
printf("x=%d, y=%d\n",x,y);
x++;
y++;
}
C++ 스타일로변경(auto는 생략해야 함)
출력 결과
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
void sub(); // 함수 선언
int main() {
sub(); // sub 함수 호출
sub(); // sub 함수 호출
sub(); // sub 함수 호출
return 0; // 프로그램 종료
}
void sub() {
int x = 10; // 지역 변수 x를 10으로 초기화
static int y = 10; // static 변수 y를 10으로 초기화 (첫 호출 시만 초기화됨)
cout << "x=" << x << ", y=" << y << endl; // x와 y 출력
x++; // x 값 증가
y++; // y 값 증가
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
변수와 메모리 영역 예시
#include <stdio.h>
int gx = 12, gy = 24; // 전역 변수, 데이터 영역에
int main(void)
{
auto int ax = 15, ay = 25; // auto변수, 스택에
static int sx = 10, sy = 20; // static변수, 데이터 영역에
printf("ax=%d 주소=%p, ay=%d 주소=%p\n", ax, &ax, ay, &ay);
printf("gx=%d 주소=%p, gy=%d 주소=%p\n", gx, &gx, gy, &gy);
printf("sx=%d 주소=%p, sy=%d 주소=%p\n", sx, &sx, sy, &sy);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Man형 구조체를 선언하고 변수를 만들어서 멤버에 접근
#include <iostream> // C++의 입출력 라이브러리 포함
using namespace std; // std 네임스페이스 사용
struct Man { // 구조체 선언
char name[10]; // 멤버
int age; // 멤버
double weight; // 멤버
};
int main() {
Man gildong, sunhee, comso[160]; // 구조체 변수 선언
gildong.age = 20; // 일반 구조체 변수의 멤버 참조
sunhee.weight = 52.5; // sunhee의 weight 멤버 초기화
comso[0].age = 25; // 배열의 첫 번째 요소의 age 멤버 초기화
cout << gildong.age << " " << sunhee.weight << " " << comso[0].age << endl; // 결과 출력
return 0; // 프로그램 종료
}
출력 결과