#include void main() { int a , b; a = 1; b = a++; printf("%d", b); } 이것의 출력 결과는? ........이거 계속 학교 다녀야 할지 의문감이 팍팍든다는 orz 계속 다녀야 할까요??
오옹 뉴페이스의 등장!!
음.. 위 문제의 정답은 멀까..
a에 1을 넣구 b 에 a에 1을 더하니까.. 정답은 머지.. 2인가??
학교 계속 다니삼~
낄낄낄...
앗.. 이거 답이 1일까 2일까;;; 1일것 같기도 하고 2일것 같기도 하고 오히려 이런게 더 아리송해버려..... 게다가.. 이게!! C++ 문제라고!! C라고 해줘야지 이런건;; C++ 이면 객체 개념을 가르쳐야 -.-
#include void main() { int a , b; a = 1; b = a++; printf("%d", b); } 어떻게 위와 같은게 C++ 문제죠, 그렇다면 제가 한번 간단한 C++ 문제를 내볼까요. #include <iostream> using namespace std; int main() { int i=0; cout<<++i<<++i<<++i<<++i<<endl; return 1; } 위의 출력 결과는 무엇일까요, 리눅스와 윈도우의 결과가 같은가요. 그리고 그 이유는 ?
오른쪽부터 처리한다, 스택
답은 아니고 힌트 ㅋㅋ;
++i 와 i++ 의 차이를 알아보기위한 ANSI-C문제인듯 :(
그리고 초보대왕님 include뒤에 <iostream>때문에 날라갔군요 ㅋㅋㅋ
설마 틀릴까? 라고 직접 해본 사람은 저 뿐이군요 ㅡㅡ;;;
왜 같을까? ㅋㅋㅋ << 와 ++ 의 우선순위? :)
기배랑 창민형 구라쟁이 ㅎㅎ;
직접 테스트 해 보세요.
저도 몰랐던 놀라운 결과가 출력됩니다.
윈도에서는 안 해 봤고, 리눅스였습니다.
점점 미궁으로 빠지는가 ㅋㅋㅋ
귀찮아서 안해봄 ㅋㅋㅋ
구라쟁이라니 버럭 ㅋㅋㅋ
윈도우와 리눅스 모드 동일한 값 4321 발생함 :)
G++ 에서 를 사용하여 cout 함수를 사용할경우 동일함
VC++ 에서 를 사용하여 cout 함수를 사용할경우 동일함
using namespace std; // 표준 라이브러리 namespace 지정
컴파일러 버전에 따라서 틀려집니다.
//using namespace std; 주석처리시
[adminj@www ~]$ g++ test.cpp -o test
test.cpp: In function `int main()':
test.cpp:6: error: `cout' was not declared in this scope
test.cpp:6: error: `endl' was not declared in this scope
gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)
[minias@web minias]$ g++ test.cpp -o test
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
cout referenceURL
http://msdn2.microsoft.com/en-us/library/bzbx67e8.aspx
C:\Program Files\Microsoft Visual Studio\VC98\Include\ostream.h
extern ostream_withassign _CRTIMP cout;
inline _CRTIMP ostream& __cdecl flush(ostream& _outs) { return _outs.flush(); }
/usr/include/g++-3/iostream.h
extern _IO_ostream_withassign cout, cerr;
extern ostream& lock(ostream& outs);
extern ostream& unlock(ostream& outs);
헉
저는 4444가 출력되는데요;;
[ufamorg@test tmp]$ cat a.cc
#include
using namespace std;
int main()
{
int i=0;
cout<<++i<<++i<<++i<<++i< return 1;
}
[ufamorg@test tmp]$ g++ a.cc
[ufamorg@test tmp]$ ./a.out
4444
[ufamorg@test tmp]$ g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
Thread model: posix
gcc version 4.0.2 20051125 (Red Hat 4.0.2-8)
[ufamorg@test tmp]$
음.. 이상하네 ㅋㅋ
C++은 몰르고;
C에서 printf에다 하면 오른쪽부터 처리해서 4321 머 그런식이 맞는데 ㅋㅋㅋ
// (이창민님) ++i 와 i++ 의 차이를 알아보기위한 ANSI-C문제인듯 : 단순히 그런 문제가 아닙니다. 따라서 좀 생각할 꺼리가 됬으면 좋겠읍니다. 수정하는 과정에서 <iostream> 이 빠졌네요. 편집기가 특수문자 '<', '>' 을 잘 처리못하는 듯 합니다.
스택에 대한거 아녜요?
초보대왕님이 무슨 이야길 하시는건지는 대략 감이 옵니다.
ANSI-C / ISO-C / C표준과 C++ 확장에 관련된 OS별 차이점이라던지 :)
C95 / C99 에 대한 자료도 많이 봤긴했었는데;;;
위의 언급한 내용은 본문의 C 구문에 대한 이야기입니다.
초보대왕님의 코드는 ANSI-C가 아니기에 :)
참고될만한 문서를 링크합니다.
http://anubis.dkuug.dk/JTC1/SC22/WG14/www/docs/n869/n869.pdf.gz
x+++++y 이런 구문이 될까요?
x++ + ++y 이런 구문이 될까요?
또한
i = ++i + 1;
a[i++] = i;
와
i = i + 1;
a[i] = i;
는 어떻게 틀릴까요 :)
The result of the postfix ++ operator is the value of the operand. After the result is
obtained, the value of the operand is incremented. (That is, the value 1 of the appropriate
type is added to it.) See the discussions of additive operators and compound assignment
for information on constraints, types, and conversions and the effects of operations on
pointers. The side effect of updating the stored value of the operand shall occur between
the previous and the next sequence point.
ㅁ_ㅁ;; 너무 쉽게 문제 내놔서 그렇다고 한탄해놓았는데 다른 문제로 논의를 하시다니 ㅡㅡ;; 그건 그렇고 저도 스택인줄 알았는데.......;;;;;
저 문제는 함수가 호출될 때 코드 영역 머 그런거랑 스택의 순서; 그런거에 관련된 거 맞삼 ㅋㅋ 물론 그 윗라인에는 창민형이 위에 말한 연산자의 우선순위 얘기도 있고효 코드 영역, 스택 얘기 나오면 시퓨 레지스터, 어셈 얘기까지 나와게 되서 대략 난감;
-- (이창민님) -- 초보대왕님이 무슨 이야길 하시는건지는 대략 감이 옵니다. -- ANSI-C / ISO-C / C표준과 C++ 확장에 관련된 OS별 차이점이라던지 :) -- C95 / C99 에 대한 자료도 많이 봤긴했었는데;;; 이런 눈치 채셧네요 거기에 더하여 C++ 에서의 컴파일러의 최적화 문제도 밑바탕에 깔려 있는 예제였읍니다. 어쩌면 이것이 가장 중요한 사항인 것 같습니다.