C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[74544] Re:문자열과 관련된 코드입니다. 도와주세요
빌더(TWx) [builder] 3672 읽음    2017-08-12 14:02
송재근 님이 쓰신 글 :
: #include <iostream.h>
:
: int main()
: {
:     char* ab = "hello";
:     if (ab == "hello")
:     {
:         cout<<"Hi";
:     }
:     else
:     {
:         cout<<"Nope";
:     }
:     return 0;
: }
:
: 이 소스코드를 실행 하면 문자열 ab를 "hello"로 정해주었으니, "Hi"를 출력하여야 하는데 얘는 자꾸만 "Nope"를 출력하네요. 무슨 문제가 있는 걸까요? 이게 "Hi"를 출력하게 하려면 어떻게 해야 할까요? 도와주세요 ㅠㅠ



답변:


위의 코드는 문법상 전혀 하자가 없는 코드입니다.
컴파일러가 파싱을 완료하면 "hello"는 바이너리 상에서 어떤 위치에 놓여지는 주소인 상수 취급 될 거기 때문인데...

위의 코드에서 Hi가 출력되지 않는 이유는 컴파일러가...


char* ab = "hello";

구문에서의 "hello" 와


if (ab == "hello")

구문에서의 "hello"를 멍청하게 다른 번지에 중복해서 생성하기 때문 입니다.
코드판단 능력 없이, 소스구문에 나타나는 대로 다른 번지로 스트링을 중복 생성하는 거죠.


사람이 생각하면서 어셈블러로 코드를 작성한다면... 멍청하게

tmpSz1 db 'hello', 0
tmpSz2 db 'hello', 0

위와 같이 토씨하나 다르지 않은 스트링에 대해서 중복 생성하는 짓을 하지 않을 겁니다.

실제 질문에 언급된 코드는 static 스트링 테이블을 구성할 때, 요긴하게 쓰여지는 코드패턴이기도 합니다.
strcmp() 쓰지 않고, 포인터 비교만으로 처리 할 수 있으니까요.

컴파일러의 String Pooling 기능과 상관 없이 질문에 언급된 코드가 원하는 대로 동작하려면
clang 포팅 컴파일러나 vc++ 2017 같은 똑똑한 컴파일러를 사용해야 합니다.
토씨하나 다르지 않은 스트링을 다른 번지로 중복 생성하지는 않거든요.

vc++ 2017의 경우에는...
릴리즈 모드로 컴파일 할 경우...

if (ab == "hello")
컴파일러가 위 구문은 당연히 같은 값을 비교하는데 왜 쓸데 없이 이런 코드를 쓰냐고 판단해서
위 구문에 대한 어셈블리 비교코드 생성을 아예 스킵해 버리고 Hi를 출력하는 코드를 바로 생성하기도 합니다.

컴파일러를 바꿔서 쓰세요.
clang 포팅버전이나 vc++2017 로...







+ -

관련 글 리스트
74504 문자열과 관련된 코드입니다. 도와주세요 송재근 3561 2017/07/28
74544     Re:문자열과 관련된 코드입니다. 도와주세요 빌더(TWx) 3672 2017/08/12
74506     Re:문자열과 관련된 코드입니다. 도와주세요 Intotheblue 3579 2017/07/30
74507         Re:Re:문자열과 관련된 코드입니다. 도와주세요 뽀뽀중 3731 2017/07/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.