1 / 96

제 7 장 함수

제 7 장 함수. 문봉근. 제 7 장 함수. 7.1 매크로함수 7.2 표준함수 7.3 사용자정의함수 7.4 변수의 스토리지 클래스 통용범위 7.5 함수간의 데이터 전달 7.6 재귀함수 7.7 main() 함수와 매개변수. 함수단위로 프로그램을 했을 때의 장점. ① 불필요한 반복을 피할 수 있으며 메모리를 절약할 수 있다 .

Download Presentation

제 7 장 함수

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 제7장 함수 문봉근

  2. 제7장 함수 7.1 매크로함수 7.2 표준함수 7.3 사용자정의함수 7.4 변수의 스토리지 클래스 통용범위 7.5 함수간의 데이터 전달 7.6 재귀함수 7.7 main() 함수와 매개변수

  3. 함수단위로 프로그램을 했을 때의 장점 ① 불필요한 반복을 피할 수 있으며 메모리를 절약할 수 있다. ② 프로그램의 모듈화(modularize)가 가능하여, 이해(readability)가 쉽고, 수정이 용이하다. 함수들을 재사용(reusability)할 수 있다. ③ 주 모듈(main함수)에는 각 기능별로 구성된 함수이름으로 구성하는 것이 바람직하며 이로 인한 전체 프로그램의 구조와 이해도가 빠르다. ④ 그 함수기능과 매개변수만을 이용하여 그 프로그램을 호출하여 사용할 수 있다.(encapsulation)

  4. 7.1 매크로 함수 • 매크로함수는 함수의 형태는 띠고 있지만 실제로 함수는 아니다. • 매크로 선언문인 ‘#define'을 사용하여 상수, 함수(수식)를 선언할 수 있다. • #define macro_name(par1[,par2,...]) [macro_body] • 매크로 확장 : 매크로 함수가 프로그램 중에 사용될 때 전처리기는 매크로명과 매개변수를 지우고, 그 위치에 매개변수를 인수 텍스트로 대체한 매크로 몸체를 삽입한다. • 매크로함수를 인라인함수(inline function)라 부르기도 한다.

  5. 예제 7.1macro 함수의 정의와 인용 #define square(t) ((t)*(t)) #define max(u,v) ((u)>(v)?(u):(v)) .... y = a + square(x+3) / square(x-3) iput(max(x+3), square(y))); => 매크로 확장 y = a + ((x+3)*(x+3)) / ((x-3)*(x-3)); iput(((x+3)>((y)*(y)) ? (x+3) : ((y)*(y))));

  6. 예제 7.2매크로 함수를 사용하는 경우 예기치 않은 에러가 발생할 경우. #define square(t) t*t #define max(u,v) ((u)>(v)?(u):(v)); .... y = a + square(x+3) / square(x-3) iput(max(x, y)); => 매크로 확장 y = a + x+3*x+3 / x-3*x-3; iput(((x)>(y) ? (x) : (y)););

  7. 예제 7.3매크로 선언은 제대로 되었지만 프로그램 중에 잘못 사용하는 경우. #define square(x) ((x)*(x)) ... a = 3; y = square(++a); => 매크로 확장 y = (++a)*(++a);

  8. 7.2 표준 함수 • 모든 표준 C 라이브러리의 구성요소는 하나이상의 표준 헤더 파일(header file)에 정의되어 있다. • 프로그램에서 라이브러리(library)의 구성요소를 사용하기 위해서는 관련된 표준 헤더의 이름을 include 지시자를 이용하여 포함시켜야 한다.

  9. 7.2.1 표준 C 헤더의 사용 • include 지시자를 사용하여 표준헤더의 이름을 사용한다. • #include <stdio.h> /* 입출력 기능포함 */ • 표준헤더를 2개 이상 사용할 때는 순서에 관계없이 include 할 수 있다. • 키워드와 같은 이름의 매크로(include)를 정의할 수 없으며, 표준헤더는 다른 표준헤더에 포함될 수 없다.

  10. 예제 7.4 표준함수 중 time(), srand()를 사용하여, 난수를 발생시키는 프로그램. #include <stdio.h> #include <time.h> #include <stdlib.h> void main(void) { int i=1; unsigned int seed; seed = time(0); srand(seed); while( i <= 5 ) { printf(" 난수 발생 결과 : %d\n", rand()); i++; } }

  11. 예제 7.5 표준 수학함수 중 삼각함수 sin(x)를 이용하여 0°부터 360°까지의 sin값을 10°간격으로 구하고, *를 이용하여 sin graph를 나타내는 프로그램.삼각함수(sin, cos, tan 등)에서 사용되는 괄호 안의 인수는 radian을 사용하며, radian = ( 각도 * π ) / 180 이다. #include <stdio.h> #include <math.h> #include <conio.h> void main(void) { int i, j; double pi=3.141593, sine; for(i=0; i<=360; i+=10) { sine = sin( (float)i * pi / 180); printf("sin(%3d)=%5.2f ", i, sine); for(j=0; j<= (int)(sine*30+30); j++) printf(" "); printf("*\n"); if( (i+10) % 190 == 0) getch(); } }

  12. 7.3 사용자 정의 함수 • 함수의 구성요소 • ① 함수의 계산 결과를 되돌려 받는 함수의 type • ② 함수이름을 나타내는 함수명 • ③ 함수로 전달될 데이터의 변수 선언 부분인 매개변수 리스트 • ④ 함수 내부에 필요한 변수의 선언 • ⑤ 각종 명령문을 수행할 함수의 본체 • ⑥ 함수를 호출한 곳으로 되돌아갈 return문

  13. 7.3.1 사용자정의함수 문법 반환데이터형 함수명(매개변수리스트) 매개변수형_선언; { 지역변수선언; 함수의_본체; return(수식) ; /* 반환문 : 여기서 수식의 데이터형은 반환데이터형과 같다 */ }

  14. 예제 7.6 사용자 정의함수의 기본 호출 프로그램. #include <stdio.h> int sub_func(int); /* 함수의 protype(원형)선언 */ void main(void) { int i; for (i=1; i<=5; ++i) sub_func(i); /*호출함수(caller) : sub_func() 함수호출*/ } int sub_func(k) /* 피 호출함수(callee) */ int k; /* 매개변수(parameter)의 형 선언 */ { int j; /* 지역변수 선언 */ /* 함수 본체 */ for (j=0; j<=k; ++j) printf("test 번호 : %d\n", j); printf("\n"); return(k); /* 함수호출 부분으로 돌아가는 반환문 */ }

  15. 7.3.2 함수의 호출 • 함수를 사용하기 위해서는 호출(call)을 하여야만 한다. • 결과를 돌려 받지 않는 경우에는 return문은 생략할 수 있으며, 이 때에는 함수가 끝나면 원래의 호출함수로 돌아간다. • 함수의 계산결과를 되돌려 받기 위해서는 한 개 이상의 반환(return)문이 있어야 한다. • 호출과 반환에 있어서 데이터형을 반드시 일치시켜야 한다. • 함수는 스스로 수행될 수 없으며, 다른 프로그램에서 호출하지 않으면 수행되지 않는다. • 함수는 식의 일부로써 사용할 수 있고, 호출 자체가 하나의 문장을 이루기도 한다.

  16. 예제 7.7 함수를 수식의 일부로 호출하여 사용하는 방법. #include <stdio.h> int max(int[], int); void main(void) { int j, x[10]={34, 56, 33, 23, 99, 33, 45, 67, 89, 9}; j = max(x, 10); /* 식의 일부로서 함수를 호출 */ printf("최대값 : %d\n", j); } int max(int y[], int n) { int i, mx=y[0]; for (i=1; i<n; ++i) if(mx < y[i]) mx = y[i]; return(mx); }

  17. 7.3.3 함수의 결과 반환 • 호출한 함수로 문장의 흐름을 돌려주고, 돌려줄 때 연산 결과를 함수에 전달하기 위해서 return문을 사용한다. • return문 뒤에 되돌려줄 변수나 수식을 기술한다. return문 뒤에는 괄호를 사용하여도 되며, 생략할 수도 있다. • 함수의 형을 void로 선언했을 경우에는 return문이 없을 수도 있다. • 함수의 형이 void가 아니고, 반환되는 값이 있다면 최소한 한 개 이상의 return문이 있어야 하며, 반환 값의 형(type)과 함수의 형은 반드시 일치해야 한다.

  18. 예제 7.8 함수의 값을 반환할 때 함수의 데이터형과 일치하여야 한다. float add_numbers( float n1, float n2 ) { return n1 + n2; /* 적절하다. */ return 6; /* 부적절하다. 데이터형이 다르다.*/ return 6.0; /* 적절하다. */ }

  19. 예제 7.9 함수에서 반환값이 없는 경우의 간단한 함수를 포함하는 프로그램 • #include <stdio.h> • void print_message( void ); /* ANSI C 함수 원형 */ • void print_message( void ) • { • printf("이것은 print_message함수에 의해 호출된 모듈이다.\n"); • } • void main(void) • { • print_message(); /* 함수 호출 */ • }

  20. 예제 7.10 일반 함수를 이용한 factorial(!)을 계산하는 프로그램. • #include <stdio.h> • void calc_factorial( int ); /* 함수 원형 */ • void calc_factorial( int n ) • { • int i, factorial_number = 1; • for( i = 1; i <= n; ++i ) • factorial_number *= i; • printf("%d 팩토리얼은 %d이다.\n", n, factorial_number ); • } • void main(void) • { • int number = 0; • printf("숫자를 입력하시오. : "); • scanf("%d", &number ); • calc_factorial( number ); • }

  21. 예제 7.11 상황에 따라서 여러 개의 return문이 필요한 경우의 함수 프로그램. /* 어떤 달의 마지막이 며칠인지 계산, 여러 개의 return문이 있음 */ #include <stdio.h> #include <stdlib.h> int last_day(int, int); void main(void) { int year, month; printf("년도를 입력하시오 : "); scanf("%d", &year); printf("월을 입력하시오 : "); scanf("%d", &month); printf("%d년 %d월은 마지막날이 %d일 입니다.\n", year, month, last_day(year, month)); }

  22. 예제 7.11 (계속) /* 어떤 달의 마지막이 며칠인지 계산, 여러 개의 return문이 있음 */ int last_day(int y, int m) /* y:년, m:월 */ { if( m == 2 ) { /*2월일 경우 28일인지 29일인지 계산 */ if(y%400 == 0 || (y%100 != 0 && y % 4 == 0)) return(29); else return(28); } else if(m == 4 || m == 6 || m == 9 || m == 11 ) return(30); /*4,6,9,11월은 30을 돌려줌 */ else return(31); /* 나머지는 31을 돌려줌 */ }

  23. 예제 7.12 여러 개의 반환문을 사용하는 다른 예 • int validate_input( char command ) • { • switch( command ) { • case '+' : • case '-' : return 1; • case '*' : • case '/' : return 2; • default : return 0; • } • }

  24. 예제 7.13 두 개의 인수를 전달하여, 그 두 수의 곱의 결과를 반환하는 프로그램 • #include <stdio.h> • int calc_result( int, int ); /* 함수 원형 */ • int calc_result( int numb1, int numb2 ) • { • auto int result; • result = numb1 * numb2; • return result; • } • void main(void) • { • int digit1 = 10, digit2 = 30, answer = 0; • answer = calc_result( digit1, digit2 ); • printf("%d * %d = %d\n", digit1, digit2, answer ); • }

  25. 예제 7.14 long 형을 되돌려주는 factorial 함수 • #include <stdio.h> • long factorial(int); /* 함수 원형 */ • long factorial(int n) /* long형을 되돌리는 함수 */ • { • int i; • long product = 1l; • for (i = 2; i <= n; i++) • product *= i; • return product; • } • void main(void) • { • int num; • long fact; • for (num = 1; num <= 10; num++) { • fact = factorial(num); /* factorial 함수 호출뒤 fact에 대입 */ • printf("%2d! = %8ld\n", num, fact); • } • }

  26. 예제 7.15 함수의 여러 가지 사용 방법. #include <stdio.h> int sum(int, int); /* 함수 원형 */ void a(); void main(void) { int s; a(); /* a 함수 호출 */ sum(10,20); /* sum 함수를 호출 */ s = sum(20,60); /* sum 함수를 호출한 후 반환 값을 s에 저장 */ printf("sum from 20 to 60 = %d\n",s); printf("sum from 10 to 100 = %d\n",sum(10,100)); }

  27. 예제 7.15 (계속) void a() { printf("This is function test.\n"); printf("Now in function a()\n"); } int sum(int a, int b) /* 정수형 변수 2개를 받아 정수형을 반환하는 함수 */ { int i, s = 0; printf("Now in function b()\n"); for (i = a; i <= b; i++) s = s + i; return s; /* s의 값을 호출한 함수에게 반환한다 */ }

  28. 예제 7.16 양수면 1, 음수면 -1, 0이면 0을 출력하는 프로그램. 이 예제는 while문을 사용하여 Ctrl + Z(EOF)를 누를 때까지 무한루프를 도는 프로그램이다. #include <stdio.h> #include <conio.h> int sign(int); /* prototype 선언 */ void main(void) { int a; printf("Ctrl + Z = exit\n"); printf("input(a)=>"); while(scanf("%d",&a) != EOF) { printf(" %d\n",sign(a)); printf("Ctrl + Z = exit\n"); printf("input(a)=>"); } } int sign(int x) { return ( (x>0) ? 1 : ( (x==0) ? 0 : -1) ); }

  29. 7.3.4 함수 원형(prototype) • 함수의 원형(Function Prototypes)은 반환되는 데이터형 검사와 함수 호출에 대한 파라미터 검사를 하기 위해서 사용된다. • C 프로그램은 일반적으로 여러 개의 다른 소스파일들로 독립적으로 분리되어 컴파일되고, 실행 프로그램을 생성하기 위해서 이들을 묶어서 링크함으로서 에러가 발생할 가능성이 있다. • 이 충돌을 피하기 위해 ANSI C는 함수 원형을 선언한다.

  30. 예제 7.17 여러 개의~ • /* 소스파일 add.c */ • void add_up( int numbers[20] ) • { • .... • } • /* 소스파일 mainline.c */ • static float values[] = { 10.2, 32.1, 0.006, 31.08 }; • void main(void) • { • float result; • ... • result = add_up( values ); • }

  31. 7.3.5 함수의 형 • C 언어는 함수 자체가 값을 반환하는 함수와 반환하지 않는 함수가 있다. • 값을 반환하는 함수는 변수선언에서 처럼 type을 선언할 수 있다. 이때 type은 C에서 정의된 기본형(int, float, char, pointer 등)과 사용자 정의형(struct, union 등)을 모두 사용할 수 있다. • 반환할 데이터 형(type)을 선언하지 않을 경우 정수(int)형으로 간주한다. • 함수의 반환 값이 없을 경우에는 void형으로 선언한다. • 값의 반환이 있는 함수의 경우에는 주고받는 매개변수의 형태에 주의하여 사용해야 한다.

  32. 문법-정수형을 반환하는 경우의 함수의 선언 int func(매개변수들) { int x; 함수 본문(function body); return(x); /* 여기서 x의 값이 정수형이라는 뜻이다. */ }

  33. 문법-반환 type을 선언하지 않은 경우 : 정수형 func(매개변수들) { int x; 함수 본문(function body); return(x); /* 여기서 x의 값이 정수형이라는 뜻이다. */ }

  34. 문법-반환하는 변수가 없는 경우 : void void func(매개변수들) { int x; 함수 본문(function body); return; /* 반환하는 값이 없으므로 return을 생략할 수 있다*/ }

  35. 예제 7.18 입력된 수를 넘겨받아 원하는 수만큼 "*"를 출력하는 프로그램 예제 /* void형 함수 */ #include <stdio.h> void print_char(char c, int n) { int i; for (i = 1; i <= n; i++) printf(" %c",c); } void main(void) { int i, n; printf("Input N -> "); scanf("%d",&n); for (i = 1; i <= n; i++) { print_char(' ',n - i); print_char('*',2 * i - 1); putchar('\n'); } for (i = 1; i <= n - 1; i++) { print_char(' ',i); print_char('*',2 * n - 2 * i - 1); putchar('\n'); } }

  36. 예제 7.19 영어의 모음, 자음, 대문자, 소문자, 숫자를 카운트하는 함수를 만들어서 이용한 프로그램 • #include <stdio.h> • int is_vowel(char); • int is_alphabet(char); • int is_upper(char); • int is_lower(char); • int is_digit(char); • void main(void) • { • char c; • int vno = 0; /*모음의 갯수를 기억할 변수 */ • int cno = 0; /*자음의 갯수를 기억할 변수 */ • int uno = 0; /*대문자의 갯수를 기억할 변수 */ • int lno = 0; /*소문자의 갯수를 기억할 변수 */ • int dno = 0; /*숫자의 갯수를 기억할 변수 */ • printf("문자열을 입력하시오 : Ctrl-Z (exit) ");

  37. 예제 7.19 영어의 모음, 자음, 대문자, 소문자, 숫자를 카운트하는 함수를 만들어서 이용한 프로그램(계속) • printf("문자열을 입력하시오 : Ctrl-Z (exit) "); • while ((c = getchar()) != EOF) { • if (is_vowel(c)) /*읽은 문자가 모음이면 */ • ++vno; /*모음 숫자를 하나 증가 */ • else if (is_alphabet(c)) /* 모음이 아닌 알파벳이면(자음이면)*/ • ++cno; /*자음 숫자를 하나 증가 */ • if (is_upper(c)) /*읽은 문자가 대문자이면 */ • ++uno; /*대문자 숫자를 하나 증가 */ • else if (is_lower(c)) /*대문자가 아닌 소문자이면 */ • ++lno; /*소문자 숫자를 하나 증가 */ • else if (is_digit(c)) /*읽은 것이 숫자면 */ • ++dno; /*숫자 카운트를 하나 증가 */ • } • printf(" Number of Vowels : %d\n",vno); • printf("Number of Consonants : %d\n",cno); • printf("Number of Uppercases : %d\n",uno); • printf("Number of Lowercases : %d\n",lno); • printf(" Number of Digits : %d\n",dno); • }

  38. 예제 7.19 영어의 모음, 자음, 대문자, 소문자, 숫자를 카운트하는 함수를 만들어서 이용한 프로그램(계속) • is_vowel(char c) /*주어진 문자가 영문 모음인지 판단하는 함수 */ • { • switch (c) { • case 'a': case 'e': case 'i': case 'o': case 'u': • case 'A': case 'E': case 'I': case 'O': • case 'U': return (1); /* 문자가 모음인 경우 1을 계산 결과로 산출 */ • default : return (0); /*모음이 아니므로 0을 계산 결과로 산출 */ • } • } • is_alphabet(char c) /*주어진 문자가 영문 알파벳인지 판단하는 함수 */ • { • return (is_upper(c) || is_lower(c)); • } • is_upper(char c) /*주어진 문자가 대문자인지 판단하는 함수 */ • { • return (c >= 'A' && c <= 'Z'); • } • is_lower(char c) /*주어진 문자가 소문자인지 판단하는 함수 */ • { • return (c >= 'a' && c <= 'z'); • } • is_digit(char c) /*주어진 문자가 숫자인지 판단하는 함수 */ • { • return (c >= '0' && c <= '9'); • }

  39. 7.3.6 함수명 (function name) • 함수를 대표하며, 함수명은 변수선언과 같이 키워드가 아닌 고유함수명이어야 한다. • 한 개의 프로그램에서 똑같은 함수명은 존재할 수 없다. • 함수명을 만드는 규칙은 변수명을 만드는 규칙과 동일하며 문자열로써 구성된다. • 첫 문자는 영대문자, 영소문자, _(underscore)중의 하나로 시작하며, 나머지 문자는 숫자도 사용할 수 있다. • 함수명을 작명할 때는 그 함수가 어떤 동작을 하는지를 분명히 나타내는 것이 좋다.

  40. 예제 7.20 함수명을 작명할 때 정확한 의미를 부여하는 것이 좋다. • #include <stdio.h> • int *matrix_add(int *, int *);/* prototype 선언*/ • int *matrix_product(int *, int *);/* prototype 선언*/ • void main(void) • { • matrix_add(); /* matrix_add()함수 호출 */ • matrix_product(); /* matrix_product()함수 호출 */ • } • int *matrix_add(int *x, int *y) /* 함수명의 뜻을 정확하게... */ • { • int *z; • printf("matrix_add()함수가 호출되었습니다.\n"); • 중략.... • return *z; • } • int *matrix_product(int *x, int *y)/* 함수명의 뜻을 정확하게... */ • { • int *z; • printf("matrix_product() 함수가 호출되었습니다.\n"); • 중략.... • return *z; • }

  41. 7.3.7 매개 변수 리스트와 매개 변수 형 선언 • 실인수 : 매개변수 중에서 main안의 호출함수에 있는 매개변수 • 가인수 : 피 호출함수의 매개변수를 가인수라 한다. • 실인수와 가인수의 매개변수의 이름은 달라도 상관이 없으나 그 형은 같아야 한다. • 가인수를 선언하는 방법은 2가지 형태가 있다. • 만약에 매개변수가 필요하지 않을 경우 매개변수 리스트는 없다.

  42. 피호출함수 sum(x,y) int x,y; /* 가인수 */ { 중략 } 피호출함수 sum(int x, int y) /* 가인수 */ { 중략 } main(){ int i, j; /* 변수선언 */중략; sum(i,j); /* 호출함수 */중략;}

  43. 7.4 변수의 스토리지 클래스 통용범위 • C 언어에서는 다양한 성질의 변수를 사용할 수 있다. • 프로그램의 전영역에 걸쳐서 사용할 수 있는 변수가 있는 전역변수 • 변수가 선언되는 함수 안에서만 사용 가능한 지역변수 • 변수가 프로그램의 어느 영역에서 사용가능 한가를 변수의 범위(scope)라 한다. • 변수를 스택에 위치시킬 것인지, 정적영역(static scope)에 위치시킬 것인지를 지정할 수 있다. • 이와 같이 변수를 특정 메모리 영역에 할당하는 것을 “Storage Class”라 한다.

  44. 표 7.1 스토리지 클래스의 통용범위

  45. 7.4.1 자동변수 • 지금까지 명시를 하지 않고 main()함수나 특정한 함수 내에서 한정적으로 사용하기 위하여 자동변수를 사용하였다. • auto란 키워드를 사용하여 auto 변수를 선언을 하기도 하지만 통상적으로 auto를 생략하고 프로그램 한다. • 이를 지역변수(local variables)라 한다. • 지역변수는 이들이 선언된 특정 함수 내에서만 존재한다. • 이들은 다른 함수에게는 알려지지 않는다. • 지역변수는 통상적으로 스택(stack)을 사용하여 구현된다. • 지역변수를 만들었던 함수가 종료되면 지역변수는 존재하지 않는다. 함수가 실행되거나, 호출될 때마다 지역변수는 재생성 된다.

  46. 7.4.1 자동변수(계속) • 함수 내에서 연산 결과를 기억할 임시변수가 필요할 때 사용하며 지역변수를 사용하지 않아도 되는 경우는 생략할 수 있다. • 지역변수는 그 함수 내에서만 사용가능하며 다른 함수에서는 사용할 수 없다. • 함수가 다르면 같은 변수명을 사용하더라도 전혀 다른 변수로 인식을 한다. • 물론 전역변수(global variable)의 경우는 모든 함수에서 선언하지 않고 사용할 수가 있으며 이 때에는 같은 값으로 사용된다. • 전역변수와 같은 변수명을 어떤 함수에서 다시 선언하여 사용하는 경우에는 그 함수에서 선언한 변수가 우선적으로 사용되며, 전역변수는 사용이 되지 않는다.

  47. 예제 7.21 함수의 내부변수가 필요 없는 경우 #include <stdio.h> int gcd(int, int); /* 함수원형 */ void main(void) { int i, j; printf("최대 공약수를 구할 두 수를 입력하시오(i, j) : "); scanf("%d, %d", &i, &j); printf("%d와 %d의 최대공약수는 %d이다.\n",i,j,gcd(i,j)); } /* 유클리드 호제법을 이용한 최대공약수 구하는 함수 */ int gcd(int x, int y) { /* 내부변수가 선언되지 않았다. */ while(x != y) if (x > y ) x -= y; else y -= x; return x; }

  48. 예제 7.22 내부 변수가 필요한 경우/다른 함수에서 같은 이름의 변수를 사용한 경우 #include <stdio.h> int max(int [], int); /* 함수원형 */ void main(void) { int i[10]={98, 84, 85, 96, 37, 48, 57, 27, 37, 48}; printf(" 배열 i에서 가장 큰 값은 %d이다.\n", max(i, 10)); } int max(int x[], int y) /* 배열 요소 중 최대값을 구하는 함수 */ { int temp_max, i; /* 내부변수가 선언되었다. */ temp_max = x[0]; /* main함수의 i변수와 여기서 선언된 i변수는 전혀 다른 별개의 변수로서 사용된다. */ for(i=1; i<y; i++) if( x[i] > temp_max) temp_max = x[i]; return temp_max; }

  49. 7.4.2 전역변수 • 전역변수(global variables)는 프로그램에 포함된 모든 함수에 의해서 액세스될 수 있다. • 전역변수는 모든 함수에게 알려져 있다. • 함수가 재 호출되어도, 전역변수는 재 생성되지 않는다. • 전역변수의 유효 범위는 변수가 어느 시점에서 선언이 되었는가에 따라서 제한될 수 있다. 전역변수는 선언 시점부터 현재의 소스파일의 끝까지 가시적(visible)이다. 즉, 선언된 시점 이후부터 사용 가능하다. • 전역변수는 일반적으로 프로그램의 첫 영역에 나오며, 다른 함수들을 사용하기 전에 선언한다.

  50. 예제 7.23 전역변수 선언을 사용하였을 경우 각각의 함수에서 전역변수의 사용 예. #include <stdio.h> int add_numbers( void ); /* 함수 원형 */ /* 이들 전역변수들은 이 시점 이 후부터 access될 수 있다 */ int value1, value2, value3; int add_numbers( void ) { auto int result; result = value1 + value2 + value3; return result; } void main(void) { auto int result; value1 = 10; value2 = 20; value3 = 30; result = add_numbers(); printf(" %d + %d + %d = %d\n", value1, value2, value3, result); }

More Related