2016-09-17 4 views
1

나는이 두 개의 문자열 비교하고 비교했을 때 : "code"예기치 않은 결과 문자열

"test" 내가 비주얼 스튜디오에서 이것을 입력 :

cout<<("t"<"c")<<endl; 
cout<<("c"<"t")<<endl; 
cout<<("code"<"test")<<endl; 
cout<<("test"<"cose")<<endl; 

결과는 다음과 같습니다 않는

1 
0 
1 
1 

을 의미가 없으면 ideone.com에서 시험해 보려고하면 결과는

가됩니다. 10
0 
1 
1 
1 

여기에 무슨 문제가 있습니까?

답변

4

문자열이 아닌 포인터 값을 비교하고 있습니다 (참고 : "cose""code"이 아닌 다른 문자이므로 다른 포인터를 지정하지 마십시오).

<string> 헤더의 std::string을 사용하면 의미있는 문자열 연산을 얻을 수 있습니다.

그런 다음 "code"s과 같은 리터럴을 사용할 수도 있습니다.

#include <iostream> 
#include <string> 
using namespace std; 

auto main() -> int 
{ 
    cout << boolalpha; 
    cout << ("t"s < "c"s) << endl; 
    cout << ("c"s < "t"s) << endl; 
    cout << ("code"s < "test"s) << endl; 
    cout << ("test"s < "cose"s) << endl; 
} 

질문에 공식적으로 코드,

cout<<("t"<"c")<<endl; 
cout<<("c"<"t")<<endl; 
cout<<("code"<"test")<<endl; 
cout<<("test"<"cose")<<endl; 

중 & hellip

; 구현 정의 된 동작을 갖기 때문에

C++ 11 §5.9/2 ND 대시 (expr.rel)

두 포인터 p 동일한 타입 포인트 q 경우에 동일한 객체 또는 동일한 배열 또는 다른 기능의 요소가 아닌 다른 객체 또는 null 중 하나만있는 경우 p<q, p>q, p<=qp>=q의 결과는 지정되지 않습니다.

당신은 그러나, std::less와 가족을 통해 잘 정의 된 방법으로 이러한 포인터를 비교

C++ 11 20.8.5/8 때문에 (비교) 할 수 있습니다

템플릿 greater, less, greater_equalless_equal의 경우 내장형 연산자 <,가 포함 된 경우에도 모든 포인터 유형의 특수화는 총 주문을 산출합니다. 10, <=, >=하지 않습니다.

그러나 포인터 비교는 일부 상황에서 유용 할 수 있지만, 아마도 문자열 리터럴을 비교하기를 원할 것입니다. 표준 라이브러리는 예를 들어 그것을하기 위해서 strcmp. 그러나 처음에 설명한대로 std::string을 사용하는 것이 좋습니다.


리터럴 "code"char 값은 불변 인 널 종료 스트링이다. 마지막 null-byte로 합계가 char 인 5 개입니다. 따라서 유형은 char const[5]입니다.

포인터가 필요한 컨텍스트에서 사용되는 식으로이 배열을 나타내는 식 (즉 "code" 리터럴)은 char const* 포인터의 첫 번째 항목에 대한 포인터로 감소합니다.

이것은 포인터에 대한 배열 표현식의 일반적인 감소입니다. C++ 03 이전 버전에서는 부패가 단지 char* (no const)으로 허용되는 리터럴에 대한 특별 규칙이있었습니다.


참고 :
은 두 개의 동일한 문자열 리터럴이 사용되는 컴파일러와 옵션에 따라 다른 포인터, 또는 동일한 포인터를 제공 할 수 있습니다 ¹.

2

등의 문자열 리터럴 "t"은 실제로 문자의 일정한 배열 (종결 자 포함)입니다.

문자열 리터럴을 사용할 때 첫 번째 문자에 대한 포인터가 생깁니다.

따라서 "t" < "c"을 수행 할 때 두 개의 서로 관련이없는 포인터를 비교합니다. "t" < "c"이 true 또는 아닐 경우 컴파일러가 문자열 리터럴 배열을 배치하기로 결정한 위치에 따라 다릅니다.

문자열을 비교하려면 std::string 또는 이전의 C 함수 strcmp을 사용해야합니다.

+0

"문자열 리터럴을 사용하면 첫 문자를 가리키는 포인터가 생깁니다." 이것은 종종 사실이지만, 일반적으로 사실이 아닙니다. –