c언어 문제

parkjunehyun의 이미지

#include

int main()
{
int a = 10;


printf("%d %d\n", a++, ++a);

printf("%d %d\n", ++a, a++);

return 0;
}

이것좀 설명해 주세요

참고로 visual c++ 2008 컴파일러를 이용했을 때의 결과를 바탕으로 설명좀 해주세요 ㅜㅜ
2008은 이상하게 연산을 하네요 ....-_-;;

mirheekl의 이미지

컴파일 방식이 다르기 때문입니다.
C 표준에 저 명령이 어떤 순서로 컴파일되어야 하는지 정해놓지 않는걸로 알고 있어요.
(정확히는 함수 인자 전달 순서요.)
따라서 컴파일러마다 달라질 확률이 큽니다.
저 코드만 보고는 어떤 결과가 나올지도 모르는 거지요.
2008이 어떤 결과를 냈는지는 2008이 없어서 알 수 없으나, 아마 컴파일된 코드를 보면 과거보다 간결해졌을것 같군요.
리스팅 파일로 컴파일해서 차이를 확인해보시면 될것 같습니다.

여튼 이런 이유로 함수 인자에서는 증감연산자를 가급적 사용하지 않는 편이 좋습니다.
이식성이나 가독성 등에서 심각한 문제를 일으킬 수 있거든요.

--
This is for you new people. I have just one rule :
Everyone fights, no one quits. If you don't do your job, I'll shoot you myself. Do you get me?

--

freestyle의 이미지

(?: , && || 제외하고)표준에서눈 저런 연산의 결과가
어떻게 나와야 한다고 정의하고 있지 않습니다.

컴파일러를 만들 때 저것을 어떻게 처리하도록 구현했느냐에 따라 다릅니다.

http://www.cinsk.org/cfaqs/html/node5.html,

이전 게시물과
그 이전 게시물을 참고 하세요.

-----------------------------
Go to the U-City

----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------

ifree의 이미지

In general, the result will be

10 (print 10 and add up to 11) 12 (add up to 12 and print 12)
13 (add up to 13 and print 13) 13. (print 13 and add up to 14)

Don't show this code to your boss.
If your boss saw you coding like this, you would be fired on the spot.

Sorry, I can't use Hangul right now.

dalili의 이미지

리눅스 레드햇 AS4에서 gcc로 컴파일 후 실행한 결과 입니다

11 11
14 12

리눅스 환경에서는 함수 호출될때 아규먼트가 스택에 들어가는 순서 때문에 저렇네 나오는듯 싶습니다
마지막 아규먼트 부터 스택에 들어가니까요
윈도우나 다른 환경에서는 안해봐서 잘 모르겠습니다
컴파일러마다 다르다고 하니까 다를 수도 있겠죠

첫번째 printf 문장에서
++a가 실행되면서 스택에 11이 들어가고, a++이 실행되면서 11이 스택에 들어갑니다(현재 a=12)

두번째 printf 문장에서
a++이 실행되면서 스택에 12가 들어가고(현재 a=13), ++a가 실행되면서 14가 스택에 들어갑니다

그리고 앞으로는 상대방 비꼬는 답변은 달지 말아 주셨으면 합니다
본인이나 잘 할 것이지 왜 남 걱정 합니까?
저도 당한적 있고, 지금 이글을 보고 있으니 상당히 짜증납니다
제가 똑같이 해드리죠 ㅋㅋ

Don't show this answer to your boss.
If your boss saw your answer like this, you would be fired on the spot.

jick의 이미지

Sure, if your boss finds you reading stuff like this in work, you might be fired on the spot...

각설하고,

뭐 위에위엣분이 맞는 말 하셨구만 (저런 코드는 절대 실무(?)에서 쓰면 안됨) 뭘 비꼰다고 흥분하시는지...

dalili의 이미지

mirheekl 님 처럼 답변 달아놓으면 됬지, slee0303 님 처럼 꼭 저런식으로 답변을 달아 놓아야 할까요?

jick님은 상사분이 저 문제 물어보신다면 이렇게 답변 하실수 있으세요?

저거는 저런 이유 때문에 저렇게 됩니다
이렇게 코드 짜놓은거 사장님이 보시면 아마 회사에서 짤리실껄요?

이게 예의에 맞는겁니까?

chadr의 이미지

영어로 쓰신분이 님에게 한 말도 아닌데 좀 흥분 하신것 같습니다.

님 말씀대로 jick님이 님에게 무슨 말을 하셨다고 그런 예를 들으시며
되려 jick님에게 따지듯 말씀하시는건 예의에 맞는 말인가요?

듣는 사람에게 따라서 좀 기분 나쁘게 들릴 수도 있지만 영어로 쓰신 분은
그 정도로 위험하지 쓰지 말라는 말을 비유적으로 쓰신 것 같습니다.

날도 더운데 릴렉스 하자구요. :)
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

dalili의 이미지

printf("%d %d\n", a++(1), ++a(2));
printf("%d %d\n", ++a(3), a++(4));

리눅스에서 해봤는데
2 -> 1
4 -> 3
순으로 스택에 들어가지 않을까요?

환경마다 차이가 있을 수도 있겠고요

함수 호출때 아큐먼트는 스택에 들어가고 함수는 스택에서 아큐먼트를 꺼내 씁니다

gardner의 이미지

길게 써놓고 보니, 엉뚱한 답글인 것 같아 삭제하겠습니다.

dalili의 이미지

비주얼 스튜디오 6.0에서 돌렸을 때 :
11 11
13 12

비주얼 스튜디오 2005에서 돌렸을 때 :
11 12
14 12

리눅스에서 돌렸을 때 :
11 11
14 12

다 제각각이군요

prio의 이미지

직접적인 답변은 많은 분들께서 해주신 것 같고..

한가지 첨언하자면 "implementation-defined" 와 "undefined"는 구분해야 합니다.

sequential point 사이의 side-effect의 순서는 "undefined"이기 때문에,

같은 컴파일러라 하더라도 버전에 따라, 심지어 최적화 옵션에 따라서도 달라질 수 있습니다.

대신 "implementation-defined"인 경우에는 그 동작이 컴파일러 매뉴얼에 명시되어 있구요.

댓글 달기

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