두 개의 문자열 리터럴 연결
Koenig의 Accelerated C ++를 읽고 있습니다. "새로운 아이디어는 +를 사용하여 문자열과 문자열 리터럴을 연결하거나 두 개의 문자열 (두 문자열 리터럴은 아님)을 연결할 수 있다는 것입니다.
좋아, 이것은 내가 생각하는 의미가 있습니다. 이제 두 가지 연습을 통해 이것을 밝히려고했습니다.
다음 정의가 유효합니까?
const string hello = "Hello";
const string message = hello + ",world" + "!";
이제 위의 내용을 실행하려고 시도했지만 작동했습니다! 그래서 나는 행복했다.
그런 다음 다음 연습을하려고했습니다.
const string exclam = "!";
const string message = "Hello" + ",world" + exclam;
이것은 작동하지 않았다. 이제 두 문자열 리터럴을 연결할 수 없다는 사실과 관련이 있음을 이해하지만 첫 번째 예제를 작동시키는 이유 ( ", world"및 "가 아닌")의 의미 차이를 이해하지 못합니다! "두 개의 문자열 리터럴? 이것이 작동하지 않아야합니까?) 그러나 두 번째는 아닙니다.
const string message = "Hello" + ",world" + exclam;
+
연산자는 왼쪽에서 오른쪽으로있다 연관성, 해당 괄호 발현하므로 :
const string message = (("Hello" + ",world") + exclam);
당신은 두 개의 문자열 리터럴을 볼 수 있듯이 "Hello"
및 ",world"
따라서, 먼저 오류를 "추가"됩니다.
연결되는 처음 두 문자열 중 하나는 std::string
객체 여야 합니다.
const string message = string("Hello") + ",world" + exclam;
또는 +
표현식의 해당 부분을 괄호로 묶어 두 번째 를 먼저 평가 하도록 할 수 있습니다 .
const string message = "Hello" + (",world" + exclam);
( )이 가장 왼쪽의 인수 중 하나 hello + ",world" + "!"
이므로 첫 번째 예 ( )가 작동 하는 것이 합리적입니다 . 즉 , 결과는 연결된 문자열 이있는 객체이며 결과 는로 연결됩니다 .std::string
hello
+
+
std::string
std::string
"!"
에 관해서는 왜 두 개의 문자열 리터럴을 사용하여 연결할 수 없습니다 +
, 그것은 문자열 리터럴 문자 단지 배열이기 때문이다 (A const char [N]
여기서 N
널 터미네이터를 들어, 문자열을 더한 길이)입니다. 대부분의 컨텍스트에서 배열을 사용하면 배열이 초기 요소에 대한 포인터로 변환됩니다.
그래서 당신이하려고 할 때 "Hello" + ",world"
실제로하려는 const char*
것은 두 개의을 함께 추가하는 것입니다. 이것은 불가능합니다 (두 개의 포인터를 함께 추가한다는 것은 무엇을 의미합니까?) 그리고 그것이 있다면 당신이하는 일을하지 않을 것입니다 그것을 원했다.
문자열 리터럴을 서로 옆에 배치하여 연결할 수 있습니다 . 예를 들어, 다음 두 가지는 동일합니다.
"Hello" ",world"
"Hello,world"
여러 줄로 나눌 긴 문자열 리터럴이있는 경우 유용합니다. 그러나 문자열 리터럴이어야합니다 . const char*
포인터 또는 const char[N]
배열 에서는 작동하지 않습니다 .
항상 유형에 주의를 기울여야합니다 .
그들은 모두 문자열처럼 보인다,하지만 "Hello"
하고 ",world"
있다 리터럴 .
그리고 당신의 예에서, exclam
A는 std::string
객체.
C ++에는 std::string
객체 를 가져 와서 다른 문자열을 추가 하는 연산자 오버로드가 있습니다. std::string
객체를 리터럴과 연결하면 리터럴에 적절한 캐스팅이 수행됩니다.
그러나 두 개의 리터럴을 연결하려고하면 컴파일러에서 두 개의 리터럴을 사용하는 연산자를 찾을 수 없습니다.
operator +
두 개의 문자열 리터럴 이 없기 때문에 두 번째 예제는 작동하지 않습니다 . 문자열 리터럴은 유형 string
이 아니라 대신 유형 const char *
입니다. 다음과 같이 수정하면 두 번째 예가 작동합니다.
const string message = string("Hello") + ",world" + exclam;
1의 경우 작업 순서로 인해 다음을 얻습니다.
(hello + ", world") + "!" 안녕하세요 + "!" 그리고 마지막으로 안녕하세요
James가 지적한 것처럼 2 번 사례는 다음과 같습니다.
( "Hello"+ ", world") + 느낌표는 2 개의 문자열 리터럴의 연결입니다.
그것이 분명하기를 바랍니다 :)
문자열 (또는 정확한 std::string
)과 문자 리터럴 의 차이점 은 후자에 대해 +
정의 된 연산자 가 없다는 것입니다 . 이것이 두 번째 예가 실패하는 이유입니다.
첫 번째 경우, 컴파일러는 operator+
첫 번째 인수 a string
와 두 번째 문자 리터럴 ( const char*
)을 사용 하여 적합한 것을 찾을 수 있습니다 . 해당 작업의 결과는 다시 a string
이므로 추가시 동일한 트릭을 반복 "!"
합니다.
참고 URL : https://stackoverflow.com/questions/6061648/concatenate-two-string-literals
'programing tip' 카테고리의 다른 글
Git 리포지토리에서 마스터에 대한 오래된 브랜치 업데이트 (0) | 2020.07.20 |
---|---|
Connect.js methodOverride의 기능은 무엇입니까? (0) | 2020.07.20 |
Android 에뮬레이터 : 네트워크 트래픽을 모니터링하는 방법 (0) | 2020.07.20 |
왜 파이썬 3.5에서 파이썬 3.4에 비해 str.translate가 훨씬 빠릅니까? (0) | 2020.07.20 |
여러 INSERT 문 대 여러 VALUES를 가진 단일 INSERT (0) | 2020.07.20 |