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