[질문] printf 문에 대한 질문입니다. 이해가가지않네요

prog4444의 이미지

아래 두개의 비슷한 소스를 보면 a/b 의 값을 구하고 몫과 나머지를 출력할때
소스1 에서는 a/b 의 값을 바로 입력했고 소스 2 에서는 미리 문장을 선언하고 그 문장을 사용했습니다 왜 아래와 같은 차이가 나는지 도통 모르겠네요..

소스1

#include <stdio.h>

main()
{
        int a,b;
        printf("Insert number ex(1,2) : ");
        scanf("%d %d",&a,&b);
        
        printf("%d/%d=%f\n", a,b,a/b);
}
결과 2.1211324(2.0이 딱 안떨어집니다.)

소스 2

#include <stdio.h>

main()
{
        int a,b;
        float c;
        printf("Insert number ex(1,2) : ");
        scanf("%d %d",&a,&b);
        c=a/b;
        printf("%d/%d=%f\n", a,b,c);
}
결과 2.00000
cinsk의 이미지

printf() 같은 경우, 가변 인자(variable length argument list)를 받습니다.

이런 함수 같은 경우, integral promotion이 각 인자에 적용되는데,
간단히 말해서, data value가 파괴되지 않도록 data type을 변경하는 것을
말합니다.

예를 들어, char a와 int b를 더하는 식에서, a를 int로 형변환해서
계산해야 제대로 계산이 되겠죠.

따라서

char, short, int는 int로, long int는 long int로,
float, double은 double로, long double은 long double로
형변환됩니다.

그리고, 한 가지 더, printf는 첫번째 인자를 제외하고는 가변 인자기 때문에,
컴파일러가 자동으로 형변환을 해 줄 수가 없습니다.

printf("%d/%d=%f\n", a,b,a/b);

위의 경우 a, b는 전부 정수형입니다. 따라서 a / b의 경우도 int형입니다.
그런데, printf는 "%f"를 해석할 때, int로 들어온(a/b때문에) 값을 "%f"을 보고
double로 해석하려 합니다.

결국, 엉뚱한 해석을 하는 것이죠.

소스 2에서 하신 것처럼 아예 double (또는 float)형으로 쓰시던가 아니면,
강제로 형을 지정해 주어야 합니다.
왜냐하면, (가변 인자라서 인자의 type을 알 수 없으므로) 컴파일러가
형 변환을 해 주지 않기 때문입니다.

즉,

printf("%d/%d=%f\n", a,b, (double)a/b);

으로 해도 됩니다.

자세한 것은 C FAQ를 참고하기 바랍니다.

prog4444의 이미지

기본적인 이해가 부족했던거 같네요 답변 감사드리고요 아래 faq 사이트 링크도 더불어 감사드립니다. ^^

댓글 달기

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