우수한님 글의 파문이 엄청나졌어요..ㅠㅠ

int i = 0;

i = ++i + ++i + ++i;    (++i가 세번입니다!!)

cout << i;

이거 답이 이상해요 ㅠㅠ


우수한님 글을 보고 옆동네 p모 컴퓨터 사이트에 올렸다가 지금 난리가 났어요 ㅠ_ㅠ

저 깜짝 놀래서 교수님한테 찾아갔는데 교수님도 모르고..

조교도 모르고..


MS에 전화까지 했는데

"고객님 Visual Studio 6.0 제품은 현재 지원기간이 만료되어 지원을 받으실 수 없습니다."

...........................



p.s > Visual Studio 2005에서는 정상적인 값이 나오더군요. VC++ 6.0 컴파일러의 태생적 한계같네요
이전 댓글 27
랜파티 2008-12-18 13:25
옆동네 링크입니다.. ▶ [평가] 프로그래머라면 이 문제 한번 풀어보세요:)   내용보기 : (Link)www.parkoz.com 댓글이 순식간에 60개를 돌파해버리네요-_-;;
히나가조아요 2008-12-18 13:32
제대로 낚으신거져 머..
랜파티 2008-12-18 13:34
떡밥을 던지려고 한게 아닌데.... VC++ 6.0에서 왜 저렇게 동작하는지 모르겠네요 i = ++i + ++i + ++i 일 경우 7 i = ++i + ++i + ++i + ++i 일 경우 11 i = ++i + ++i + ++i + ++i + ++i 일 경우 16이 나와요 이상합니다..;;
라토(lateau) 2008-12-18 13:41
ㅎㅎㅎ 표준이라 해도 그렇게 엄격하지 않은 터라, 말 그대로 컴파일러 맘입니다. 너무 고민하지 마세요;;; p모 사이트 난리도 아니군요;;
GERMAN[OdiN] 2008-12-18 13:41
저는 뭐 C랑 Python 위주의 프로그래머니깐... C++ 은 자연스레 패스를 ;;; 어렵기도 하고요 ^^;;
YoonKH 2008-12-18 13:44
++i + ++i + ++i 가 (++i + ++i) + ++i로 계산되는 것 같습니다. i가 4개인 경우에도 마찬가지고요.. 제가 돌려보진 않앗짐나 랜파티님 리플을 보니 그럴 것 같군요..
라토(lateau) 2008-12-18 13:45
아마도 ++i 연산에서 i값이 '동일하게 증가한다'라는 것이, 2개까지만 보장되나 봅니다. i = ++i + ++i + ++i => i = 3 + 2 + 2 // 결과:7 i = ++i + ++i + ++i + ++i => i = 4 + 3 + 2 + 2 // 결과:11 i = ++i + ++i + ++i + ++i + ++i => i = 5 + 4 + 3 + 2 + 2 // 결과:16 뭐 대충 그런 것 같습니다; 정확한 건 아니니... 설명해드렸으니 해피 방출해주시나요??? ㅎㅎ -_-;;;;
랜파티 2008-12-18 13:49
라토님 / 그러니까 그 규칙 자체가 이상하지 않아요?ㅠㅠ VS2005에서는 3개 하니 9로 제대로 나오던데.. 이상하니까 치과가야겠어요 (?!)
서기옵빠 2008-12-18 13:52
우수한님께서 내신 문제는 컴파일러따라 결과가 다릅니다. C언어일때부터 문제가 되었던 부분인데... 결론은 "동일라인에서 동일변수에 대해 ++, -- 연산을 하지않는 것이 좋다" 입니다. 제가 보기엔 소모적인 논쟁일뿐입니다. ^^;;; 칼자루는 프로그래머가 아닌 컴파일러 개발자가 쥐고 있기 때문입니다. ㅎㅎ
stardori 2008-12-18 13:52
VS2005 C++ 컴파일러로 9가 나오는데요? ++i 를 두개 더해서 4가 나오는 거랑 같은 원리인듯하네요.
GERMAN[OdiN] 2008-12-18 13:52
(흠... gcc 로 볼때는 연산 순서 자체가 (++i + ++i) + ++i) 의 구조로 이루어 지네요 이미 앞쪽의 더하기 연산이 이루어 지고 난 뒤에 ++i 의 연산과 더하기 연산이 이루어 지게 되는군요... 뒤에 연산 모두 마찬가지가 될 듯 합니다... 우선 연산 순서대로 진행되는 것은 수학 식에 따른 것이니 맞구요 앞쪽에 2+2 가 먼저 일어나는 이유는 변수에 값이 연산 이전에 할당 되어야 한다는 ++(변수) 연산 법칙이 우선 성립해서 그런 듯 하네요....
GERMAN[OdiN] 2008-12-18 13:53
요약하건대 컴파일러 별로 동일 라인의 변수가 설정 된 이후에 연산이 이루어 지느냐 아니면 수학식 순서대로 변수 연산과 더하기 연산이 이루어 지느냐 이 차이가 크게 대두될 것 같네요
랜파티 2008-12-18 13:56
GCC에서는 ++i + ++i가 3이 나온다는군요 ㅇ
랜파티 2008-12-18 13:57
확실히 이 문제 재밌긴 합니다..컴파일러 특징을 명확히 보여주네요
GERMAN[OdiN] 2008-12-18 14:03
gcc 도 버전 별이나 플랫폼 별로 다르더군요 우분투나 CentOS, 레드햇 같은 경우는 또 ++i + ++i 는 4가 나오네요
라토(lateau) 2008-12-18 14:05
ㅎㅎ 공부하기엔 좋은 코드이지만 '결코 써서는 안되는 코드' 중 하나가 아닐까 싶네요. ㅎㅎ 자바에서도 ++i + ++i 는 3입니다. 칼자루는 컴파일러 개발자에게~
랜파티 2008-12-18 14:08
확실히 저런 애매한 코드는 이해하기도 힘들고-_- p모 사이트의 댓글 중 인상깊은게 있더군요 내 밑에 애들이 이런 코드 쓰면 패버린다[....] 허메 무서웡 ㅠㅠ
랜파티 2008-12-18 14:26
VC 6.0으로 코딩하면 이렇게 되는군요. MOV EAX,DWORD PTR SS:[EBP-4] ; 변수초기화 ADD EAX,1 ; EAX에 1을 더함, ++i = EAX : 1 MOV DWORD PTR SS:[EBP-4],EAX ; EBP-4에 EAX를 옮김 = EBP-4 : 1 MOV ECX,DWORD PTR SS:[EBP-4] ; ECX(0)에 EBP-4(1)을 옮김 = ECX :1 ADD ECX,1 ; ECX(1)에 1 더함, ++i = ECX : 2 MOV DWORD PTR SS:[EBP-4],ECX ; EBP-4에 ECX(2)를 옮김 = EBP-4 : 2 MOV EDX,DWORD PTR SS:[EBP-4] ; EDX에 EBP-4(2)를 옮김 = EDX : 2 ADD EDX,DWORD PTR SS:[EBP-4] ; EDX에 EBP-4(2) 더함 (++i + ++i) = EDX : 4 MOV EAX,DWORD PTR SS:[EBP-4] ; EAX에 EBP-4(2)를 옮김 = EAX : 2 ADD EAX,1 ; EAX(2)에 1 더함 = EAX : 3 MOV DWORD PTR SS:[EBP-4],EAX ; EBP-4에 EAX 옮김 = EBP-4 : 3 ADD EDX,DWORD PTR SS:[EBP-4] ; EDX(3)에 EBP-4(4)를 더함 = EDX : 7 MOV DWORD PTR SS:[EBP-4],EDX ; EBP-4에 EDX 옮김 = EBP-4 : 7 MOV ECX,DWORD PTR SS:[EBP-4] ; ECX(2)에 EBP-4(7) 옮김 = ECX : 7 즉, ++i + ++i + ++i는 앞의 ++i 2개를 먼저 더한뒤 임시변수에 저장하고, 그뒤에 i에 1을 더 추가하여 4 + 3이 되는듯 합니다. 덤으로.. REP STOS DWORD PTR ES:[EDI] ; 변수초기화(ECX) MOV DWORD PTR SS:[EBP-8],0 ; 변수초기화(EBP-8) MOV EAX,DWORD PTR SS:[EBP-8] ; 변수초기화(EAX) ADD EAX,1 ; EAX에 1 더함(++i) = EAX : 1 MOV DWORD PTR SS:[EBP-8],EAX ; EBP-8에 EAX 옮김 = EBP-8 : 1 MOV ECX,DWORD PTR SS:[EBP-8] ; ECX에 EBP-8 옮김 = ECX : 1 ADD ECX,1 ; ECX에 1 더함(++i) = ECX : 2 MOV DWORD PTR SS:[EBP-8],ECX ; EBP-8에 ECX 옮김 = EBP-8 : 2 MOV EDX,DWORD PTR SS:[EBP-8] ; EDX에 EBP-8 옮김 = EDX : 2 ADD EDX,1 ; EDX에 1 더함(++i) = EDX : 3 MOV DWORD PTR SS:[EBP-8],EDX ; EBP-8에 EDX 옮김 = EBP-8 : 3 MOV EAX,DWORD PTR SS:[EBP-8] ; EAX에 EBP-8 옮김 = EAX : 3 ADD EAX,DWORD PTR SS:[EBP-8] ; EAX에 EBP-8 더함 = EAX : 6 ADD EAX,DWORD PTR SS:[EBP-8] ; EAX에 EBP-8 더함 = EAX : 9 VC2005는 확실하게 ++ 와 +의 우선순위를 지키고있군요.. -_-;; 파코즈 조경민님 댓글 펌.
Topdawg 2008-12-18 14:29
재밋는 문제를 떠나서 서기옵빠님의 말에 한손을 들겠습니다.^^ 애매한 문장은 피해라. 라는게 다들 아시는 기본철직일것이니.캬캬캬 저도 집에 자바퍼즐러라는 재미난 문제집이 있는데.. 조만간 한문제 올려서 괴롭혀드리겟습니다!! 크하하하
랜파티 2008-12-18 14:29
확실히 복잡한 코드는 어셈으로 보는게 편해요 :)
GERMAN[OdiN] 2008-12-18 14:33
뭐 파이썬은 ++ 연산이 없어서 저런 문제에 고민 안해요 껄껄
깽미 2008-12-18 15:26
vs2008로 하니까 i=++i + ++i; 부터 하나씩 추가 한순으로 하면 3,6,10,15로 나오네요 -ㅅ-; 컴파일러마다 차이가 큰가부네 ..
카니자 2008-12-18 15:30
ㅎㄷㄷㄷㄷ. 여기 전문가들 많으시군요..... 뭔 말인지 하나도 모르겠네..ㅋㅋㅋㅋㅋㅋ
DarkHolicR 2008-12-18 17:43
어라.. 랜파티.. 뉘신가 했는데 형님이셨군요 ;ㅅ;...
랜파티 2008-12-18 19:56
동근씨 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 내 근성은 천하제일이거등요 동근씨한테 받은것만 많아서 큰일이네.;; 좀있다가 커다란거 한개 보내줄게요..ㅋㅋ
와나 2008-12-19 12:49
프로그래머 많네 =.= 하긴 키보드 사이트니.. 저딴 코드쓰는 부하직원은 패버린다 한표 ㅋ
Binushi 2008-12-19 14:00
외계어다에 한표 ㅠ.ㅠ
← 자유게시판 목록으로