C언어 printf함수의 실행순서가 앞에서 부터 아닌가요???

kkwootae의 이미지

이상하게 순서가 하나씩 밀리네요

소스를

printf("학생1 %d<%c> %d<%c> %d<%c> %d %lf\n",a[0],grade(&a[0]),a[1],grade(&a[1]),a[2],grade(&a[2]),alltotal(),average(total));
printf("학생2 %d<%c> %d<%c> %d<%c> %d %lf\n",a[0],grade(&a[0]),a[1],grade(&a[1]),a[2],grade(&a[2]),alltotal(),average(total));
printf("학생3 %d<%c> %d<%c> %d<%c> %d %lf\n",a[0],grade(&a[0]),a[1],grade(&a[1]),a[2],grade(&a[2]),alltotal(),average(total));

식으로 짰습니다. 뒤에 alltotal과 average는 함수로 total이라는 변수를 alltotal에서 연산하여 average에서 받아서 평균을 내는것인데

학생 1의 평균이 학생2의 평균에 출력되고 학생2의 평균이 학생3의 평균에 출력되네요 ;;;;;;;;;;;;

학생 1의 평균은 변수 total의 초기값을 0으로 잡아줘서 0으로 나오고요;;;;;;;;;

prinft 함수 실행순서가 뒤에서 부터인가요????ㅠㅜㅠㅜ

bluekyu의 이미지

순서가 뒤에서부터 인걸로 알고 있습니다. 저도 예전에 c 배울 때 비슷한 경험을 한 적이 있습니다. 그때는 visual c++ 을 사용했고요.

--------blog--------
http://bluekyu.textcube.com/

/*** Signature ******************
* blog: http://blog.bluekyu.me/ *
********************************/

prio의 이미지

c 표준에서는 함수 인자들의 계산 순서를 따로 정하고 있지 않습니다.
한 마디로 컴파일러에 따라 다르고, 같은 컴파일러라도 최적화 방식에 따라 다릅니다.

kkwootae의 이미지

그럼 앞에서부터 할때도 있고 뒤에서 부터 할때도 있는거예요??????ㅠㅜㅠㅜ

그럼 제가 원하는데로 출력 결과가 나오지 않는데........어떻하죠??????

다른 방법으로 해야하는거겠죠?!ㅠ

danskesb의 이미지

임시 변수라는 신이 내린 물건이 있습니다.

---- 절취선 ----
http://blog.peremen.name

semmal의 이미지

인자에서 여러 상태를 변화시키는 건, 상황이 너무나도 명확할때 말고는 지양하는게 좋습니다.
상태는 한줄에 하나씩만 바꾸는게 제일 알기 쉽습니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

IsExist의 이미지

cdecl calling convention에 의해서 파라메터 push가 뒤에서 이루어 집니다. 따라서 printf 문 호출에서
맨 마지막 파라메터가 계산되고 push 되고 그 다음 왼쪽이 계산되고 push되고 최종 printf문이 호출되죠.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

prio의 이미지

cdecl은 인자가 오른쪽에서 왼쪽의 순서로 스택에 쌓인다는 것만 정의할 뿐,
각 인자가 어떤 순서로 evaluation되는가는 정하지 않고 있습니다.
대개는 오른쪽에서 왼쪽으로 이루어지기는 하지만,
그것을 의존하여 코드를 작성하면 안되는 성질입니다.
단순히 이식성이 떨어지는 것이 아니라
같은 플랫폼 내에서도 보장이 되지 않는 성질이니까요.

라스코니의 이미지

한가지 동작만 일어나게 하세요. side effect 을 1개로 하라는 말인데요.

printf(" ...", func(1), func(g(b), g(c)) 와 같은 호출은 side effect 가 4개 정도나 되는군요.
그 결과로 portable 하지 않게 되었습니다.

x = func(1)
y = func(g(b))
z = g(c)

printf(" ... ", x, y, z)

이런 식의 코딩이 알기도 쉽고, 양쪽간에 속도의 차이는 전혀 없습니다.

tsangel의 이미지

인자들의 평가순서가 어떻게 되는지 알 수 없기 때문에 이러지 말라고 한 내용이 '교양' C 언어 교과서에 있었던듯 하지 말입니다. (그책이 A book on C인지 피터노튼이 쓴 C programming이란 책인지 당최 기억이 안나지 말입니다)

열심히 살자

댓글 달기

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