[C 문법] 함수 공부하다 막히는 예제가 있어 질문드립니다.

개성만점의 이미지

안녕하세요?
저는 27살에 개발자 진로를 정하고 2개월 뒤, 방통대 컴퓨터 과학과 3학년 편입예정인
비전공자 출신 독학도 입니다. 학교에서 정식으로 배우기 전에 스스로 C언어 문법만큼은 꼭 마치고 가고싶어서
나름 애를 쓰고있습니다. ^_^ 질문 드리겠습니다.

#include<stdio.h>
 
int Add(int num1, int num2)
{
	return num1 + num2;
}
 
void ShowAddResult(int num)
{
	printf("덧셈결과 출력: %d \n", num);
}
 
int ReadNum(void)
{
	int num;
	scanf("%d", &num);
	return num;
}
 
void HowToUseThisProg(void)
{
	printf("두개의 정수를 입력하시면 덧셈결과가 출력됩니다. \n");
	printf("자! 그럼 두 개의 정수를 입력하세요. \n");
}
 
int main(void)
{
	int result, num1, num2;
	HowToUseThisProg();
	num1 = ReadNum();
	num2 = ReadNum();
	result = Add(num1, num2);
	ShowAddResult(result);
	return 0;
}

위의 예제를 컴파일하면,

-------------------------------------------------
두 개의 정수를 입력하시면 덧셈 결과가 출력됩니다.
자! 그럼 두개의 정수를 입력하세요.
(정수2개 입력받음. 예를들어) 12 24
덧셈결과 출력:36
------------------------------------------

이렇게 됩니다.

제가 궁금한 부분은,

1. 어떤 과정으로 'scanf함수를 2번 호출했느냐' 입니다. 물론 변수가 2개라서 2번호출 하는건 알겠는데,

num1=ReadNum(); // 이부분 과
num2=ReadNum(); // 이 부분에서 scanf함수를 어떤식으로 변수에 저장하는건가요?

printf함수는 값을 저장하는데 scanf함수는 어떤식으로 저장을하는지..잘 이해가 안갑니다. 대충 머릿속으로 연상이 되어 그렇게 된거는 알겠는데 뭔가 개운하게 이해가 잘 안됩니다.

2. 1번 물음이 막히니,

result=Add(num1,num2); // 이 코드에서도 Add함수에 어떤걸 매개변수로 쓴다는 건지 .. 또 막혔고,그걸 또 어떻게 result에 저장한다는 건지 또 막혔습니다.

3. 마지막으로,

ShowAddResult(result); 함수를 호출했을때, printf함수 호출로 인해 합계가 출력되는 건 알겠는데..
scanf함수를 2번 쓴 부분이 정확히 어딘지 잘모르겠습니다.

좀더 깔끔하게 질문을 다시 요약한다면, 제가 scanf 함수를 변수에 저장하는 그 과정이 머릿속에 잘 정리가 안되는 것 같습니다. printf함수를 변수에 저장하면 값이 저장되서 빨리 이해가 가는데 사용자로부터 입력받는 개념을 저장한다고 생각하니.. 그리고 그 입력받기로 예정된 과정을 또 더하는 과정이..ㅜㅜ절 좀 답답하게합니다.
예제의 난이도가 그리 높은편은 아니지만 ㅜ_ㅜ... 약간의 설명을 해주신다면 제게 큰 힘이 될 것입니다.

peecky의 이미지

main 함수의 num1 = ReadNum(); 부분을 보면, ReadNum 함수를 호출하여, ReadNum 함수 내부가 실행됩니다.

ReadNum 함수의 내부를 보면,
scanf 함수에 "%d"와 &num 을 넘겨줍니다. &num은 num 변수의 주소값(메모리 번지 수)입니다.
scanf 함수는 사용자에게 12라는 값을 받아서, 앞에서 전달받은 메모리 번지에 12라는 값을 기록합니다. 그러면 num 변수의 값이 12가 됩니다.
그리고 return num 을 합니다. return num을 하게 되면, num변수의 값을 복사하여 ReadNum 함수를 호출해준 곳(즉 main 함수)으로 돌아갑니다. 그러면 main 함수의 num1 = ReadNum(); 부분이 num1 = 12; 가 됩니다!! 이런 과정으로 main 함수의 num1에 12라는 값이 기록됩니다.

result = Add(num1, num2); 부분이 실행되는 시점에는 main 함수의 num1은 12라는 값이, num2는 24라는 값이 기록된 상태입니다. Add 함수 내부에서 return 12 + 24; 가 되고, 이것은 return 36; 이 되고, main 함수로 돌아와서 result = 36; 이 됩니다.

raymundo의 이미지

뭔가 질문하신 분이 '저장'을 무슨 의미로 생각하시는지 짚고 넘어가야 할 것 같은데요.

계속 "... 함수를 변수에 저장하는"이라고 쓰시는데, 저 코드에서 어떤 함수도 변수에 저장되고 있지 않습니다. 특히나 printf 함수를 변수에 저장하는 건 빨리 이해가 간다고 하셨는데, 어떤 코드를 보고 그런 말씀하시는 건지 적어주시면 좋을 것 같습니다.

num1 = ReadNum();

이 코드(등호를 사용한 대입문)는 등호 우측에 있는 식을 평가하여 (평가라는 말이 낯설다면 그냥 계산하여라고 생각하셔도 됩니다) 최종 결과를 num1 변수에 저장하는 것이지 ReadNum()이라는 함수를 저장하는 것이 아닙니다.

num1 = 3;          // num1 에 3을 저장
num1 = 3 + 5;   // 3 + 5 를 '먼저' 계산하고, 그 결과인 8을 num1 에 저장
num1 = ReadNum();   // ReadNum()이라는 함수를 '먼저' 호출하여 수행하고, 그 함수가 반환하는 값을 num1 에 저장

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.