b [2]가 왜 거짓입니까?


11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

세트

b[] = {true, true, false};

b[2]거짓입니까?

경우 A==BA==C, 그 의미하지는한다 B==C?



나는 지금 내 실수를 보았고 포인터를 비교하는 것을 처음으로 혼동하지 않았기 때문에 deja vu 느낌이 들었습니다.
NoComprende

답변:


14

이 표현에서

s.c_str()==""

두 개의 포인터 (주소)가 비교됩니다. 첫 s.c_str()번째 문자는 반환 한 포인터 이고 두 번째 문자는 문자열 리터럴의 첫 번째 문자 (0 문자 종료)의 포인터 ""입니다.

주소가 다르다는 것은 명백합니다 (문자열 리터럴에는 정적 저장 기간이 있음을 명심하십시오).

예상되는 결과를 얻으려면 대신 작성해야합니다

std::strcmp( s.c_str(), "" ) == 0

이 두 표현은

s==""

s==s.c_str()

표준 클래스 std :: string에 올바른 피연산자에 대해 연산자 ==가 오버로드되었으므로 비교 된 문자열이 있습니다.


표준 은 마지막 경우에 포인터가 다르도록 보장 합니까 ? 나는 그들이 할 수 있음을 이해합니다.
Jeffrey

UB 여야 만 추가 할 수 있습니다. "문자열 리터럴과 비교하면 지정되지 않은 동작이 발생합니다"
Roout

@Jeffrey 적어도 문자열이 비어 있기 때문에 보증합니다. :) 그러나 어떤 경우에도 std :: string 클래스는 생성자의 인수 사본을 사용합니다.
모스크바에서 블라드

1
@Roout- "UB"는 정의되지 않은 동작을 의미합니다. 이는 언어 정의가 ** 프로그램의 동작이 무엇인지 알려주지 않음을 의미합니다. 정의되지 않은 동작을 가진 프로그램 은 유효한 C ++ 프로그램이 아닙니다. "지정되지 않은 동작"은 몇 가지 대안이 있으며, 표준에 따라 어떤 대안이 선택 될 것인지는 알려주지 않습니다 프로그램은 유효하며 구현시 대안을 선택할 수 있습니다
Pete Becker

@PeteBecker UB 있는 프로그램 여전히 유효한 C ++ 프로그램입니다 (적어도 성공적으로 컴파일되어 실행될 수 있다는 의미에서).
trolley813
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.