안녕하세요 c언어 질문드립니다~

익명 사용자의 이미지

만약에 함수를 만들 떼
int add(int a,int b)
{ int result:
result=a+b;
return result;
}
여기서 매개변수, add함수안에서의 result도 지역변수라서 add라는 함수를 빠져나올때 아예 메모리에서 사라지는데 return은 result라는 변수를 반환하는것이 아니라 result에 들어있는 값을 반환하는거라서 초기화 되지 않는 것인가요?

너무 길게 물어봐서 죄송합니다 근데 너무 궁금해서
저 함수를
void add(int a,int b)
{ int result;
result=a+b;
}
로 바꾼다면 a값과 b값을 대입한다해도 return을 이용한 반환값을 표현 못하기때문에 result는 사라지는게 맞나요?

세벌의 이미지

익명 사용자의 이미지

알려주셔서 감사합니다!
근데 추가적으로
int inc(int count)
{
count++;
return count;
}
라는 함수를 짰을때 여기서는 이 함수를 실행해도 값이 count++값이 반환되는게 아니라 count값이 반환되더라구요
왜그런지 알 수 있을까요?

익명 사용자의 이미지

질문 좀 추가하고 싶어서요

위에 함수를
int inc(int count)
{
return count++
}
이라 했을땐 값을 count++값을 반환하나요?
그리고 위에거는 call by value 라서 이 함수 식에서 변수자체를 메인 함수에 가져오지 못해서 위에 식에서 count만 반환되는것인가요?
많이 물어봐서 죄송합니다

raymundo의 이미지

질문이 애매한데, 호출하는 쪽 코드까지 같이 쓰시는 게 나을 것 같고요.

"count++ 값"이라는 말 자체도 이상합니다. 이건 그냥 count의 값입니다. 다만 count 자체가 저 시점 이후 다음 구문이 실행되는 시점 이전에 1증가될 뿐.

암튼 위 코드는 inc(10)을 호출하면 10을 반환할 겁니다. count 가 아직 증가하지 않은 상태에서 count의 값을 반환하니까.
그리고 위위의 코드, count++ 먼저 하고 그 다음 return count 하는 코드는 11을 반환하겠죠. 증가된 후의 count 값을 반환하니까.

어째서 위위 댓글에서 "여기서는 이 함수를 실행해도 값이 count++값이 반환되는게 아니라 count값이 반환되더라구요"라고 쓰셨나 모르겠네요. 당연히 1증가된 값을 반환했을 텐데요.

만일

int main() {
   int num = 10;
   inc(num);
   printf("%d", num);   // 왜 여기서 num 이 여전히 10인가라는 질문이라면
}

그건 말씀하신 대로 call by value 라서 main의 num과 inc의 count는 완전히 별개의 변수라서 그렇습니다. inc 가 호출될 때 num의 값 10이 복사되어 count에 저장되죠. 이제 count 값을 어떻게 바꾸든, 함수 호출이 종료된 후 main에 복귀했을 때 num에는 영향을 미치지 않습니다.

좋은 하루 되세요!

익명 사용자의 이미지

진짜 감사합니다!
count++값이라 한 의미는 잘못 말한 것 같습니다
말씀해주신것처럼 저기서 왜 num 이 여전히 10인가라는 질문이 합당한거 같습니다.
만약에 저기 11로 값을 변하게 하고 싶다면 위위 함수에서 return count++라고 표현해야 하나요?
아니면 static count라고 정적변수로 선언한 후 해야하나요?

raymundo의 이미지

여전히 문제의 핵심을 잘못 짚고 계신 것 같은데요...

main의 num 변수와 inc의 count 변수는 서로 관계 없는 별개의 변수이기 때문에 count 를 뭘 어찌하든 num에 영향을 주지 못합니다.

호출되는 함수 쪽에서 호출하는 함수에 있는 변수의 값을 조작하려면(원하시는 게 이게 맞는지도 잘 모르겠지만)

1. 변수의 주소를 함수에 넘겨주고, 함수 쪽에서는 그 주소를 이용하여 변수에 접근한다.

int main(void)
{
    int num = 10;
    printf("before: %d\n", num);
    inc_by_address( &num );     // 1. num의 주소를 넘겨줌
    printf("after: %d\n", num);
}
 
void inc_by_address( int * pointer ) {  // 2. pointer에는 num의 주소가 담김
    *pointer = *pointer + 1;      // 3. 주소를 이용하여 num 변수의 값을 읽거나 씀
}

2. 하지만 지금 같은 경우는 그냥 "인자로 받은 값보다 1 큰 값을 반환하는 함수"를 만들고 반환값을 num에 다시 대입하시면 됩니다.

int main(void)
{
    int num = 10;
    printf("before: %d\n", num);
    num = inc_and_return( num );    // 반환값을 다시 num에 대입하면 이젠 num값이 바뀌겠죠.
    printf("after: %d\n", num);
}
 
int inc_and_return( int original ) {
    return original + 1;
 
    // 또는
    int result = original + 1;
    return result;
 
    // 또는
    original++;
    return original;
 
    // 또는
    return ++original;
 
    // 또는
    original = original + 100 - 200 + 101;
    return original;
}

~

좋은 하루 되세요!

익명 사용자의 이미지

아 감사합니다!!!

라스코니의 이미지

이렇게 하세요.

int inc(int count)
{
return (count+1);
}

input 파라미터는 기본적으로 const 라고 생각하시고 프로그래밍 하십시요.

익명 사용자의 이미지

앗 정말 감사합니다 알고싶은게 이 답이었어요
본 질문식에서 result=a+b라고 하였는데 저기서는 값을 반환하고
count에 관련된 함수 식에서는 바뀌지 않은 count를 반환하는것인가요?
그래서 return count가 아니라 return (count+1)로 표현하신 것인지 궁금합니다.

라스코니의 이미지

우선 C 언어는 값만을 반환합니다. 그것이 산술값이 되었던 포인터 연산 값이 되었던지에 상관없이 무조건 값만을 반환합니다. 따라서 함수의 반환값이 값 자체라고만 생각하시면 새로운 감을 느끼실 것 같고요.

반환하는 메커니즘을 제대로 살펴보기 위해서는 어떻게 C 언어가 스택을 쌓으면서 함수를 호출하고 실행하는지에 대한 자료를 참조하는게 필요한데 구글링을 하시면 될 것 같고요.

왜 count++; return count; 라고 하지 않고 return (count + 1)이라고 했냐하면

전자는 스택에 쌓여진 함수 파라마터 자체를 수정합니다. 잘못된 것은 아니지만 저는 함수 파라미터 자체를 수정하기 때문에 선호하지 않습니다.

후자는 군더더기 코드도 생산하지 않고 코드 가독성도 좋아 보입니다.

실제로 이렇게 간단한 코드는 사용하지 않기 때문에 논외지만 만약 N을 더해서 리턴하는 함수를 예로 들으면 어떨까요?

for(조건문) count++; return count;가 나을까요? 아니면 return (count + N); 이 나을까요?

물론 후자이겠지요. 약간의 확장성만 고려해도 함수 설계가 달라질 수 있습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.