문자열이 아닌 포인터 값을 비교하고 있습니다 (참고 : "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<=q
및 p>=q
의 결과는 지정되지 않습니다.
당신은 그러나, std::less
와 가족을 통해 잘 정의 된 방법으로 이러한 포인터를 비교
C++ 11 20.8.5/8 때문에 (비교) 할 수 있습니다
” 템플릿 greater
, less
, greater_equal
및 less_equal
의 경우 내장형 연산자 <
,가 포함 된 경우에도 모든 포인터 유형의 특수화는 총 주문을 산출합니다. 10, <=
, >=
하지 않습니다.
그러나 포인터 비교는 일부 상황에서 유용 할 수 있지만, 아마도 문자열 리터럴을 비교하기를 원할 것입니다. 표준 라이브러리는 예를 들어 그것을하기 위해서 strcmp
. 그러나 처음에 설명한대로 std::string
을 사용하는 것이 좋습니다.
리터럴 "code"
char
값은 불변 인 널 종료 스트링이다. 마지막 null-byte로 합계가 char
인 5 개입니다. 따라서 유형은 char const[5]
입니다.
포인터가 필요한 컨텍스트에서 사용되는 식으로이 배열을 나타내는 식 (즉 "code"
리터럴)은 char const*
포인터의 첫 번째 항목에 대한 포인터로 감소합니다.
이것은 포인터에 대한 배열 표현식의 일반적인 감소입니다. C++ 03 이전 버전에서는 부패가 단지 char*
(no const
)으로 허용되는 리터럴에 대한 특별 규칙이있었습니다.
참고 :
은 두 개의 동일한 문자열 리터럴이 사용되는 컴파일러와 옵션에 따라 다른 포인터, 또는 동일한 포인터를 제공 할 수 있습니다 ¹.
"문자열 리터럴을 사용하면 첫 문자를 가리키는 포인터가 생깁니다." 이것은 종종 사실이지만, 일반적으로 사실이 아닙니다. –