저는 C ++를 처음 사용하고이 질문은 많은 사람들에게 사소한 것처럼 보일 수 있지만 C ++ 언어를 시작하는 중이라는 것을 명심하십시오.
변수 x
를 같게 할당했고 20
이를 문자열과 연결하고 싶습니다. 내 C ++ 코드는 다음과 같습니다.
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int x = 20;
int y = 15;
if (x >= y) {
cout << x + " is greater than " + y;
}
}
내 예상 결과는 20 is greater than 15
이지만 대신 나타나는 것은 약간 이상 é@
합니다. 혼란스럽고 GeeksForGeeks, w3schools 또는 나머지 SO에서 솔루션을 찾을 수 없습니다.
나는 사용 cout << x << " is greater than " << y;
이 잘 작동 한다는 것을 이해 하지만 왜 여기에서 연결이 작동하지 않는지 잘 모르겠습니다. 또한 왜이 이상한 캐릭터가 대신 나오는 걸까요?
미리 감사드립니다.
(또한, 질문에 대답하지 않고 대답을 방치하지 마십시오. 시작 JS 내가 질문을하고있는 유일한 대답은 때 내가 기억 "사용하지 마십시오 document.write
."나는 그것을 얻을 수 있지만, 실제로는 훨씬 더하는 것입니다 대답 을 질문하고 그것을 부수적으로 넣으십시오.)
이상한 출력을 얻는 이유는 C ++의 역사의 일부가 C의 진화이기 때문입니다. 표현식 x + " is greater than " + y
에서 표현식 " is greater than "
은 const char*
원시 C 스타일 유형 인 리터럴입니다. std::string
이전 버전과의 호환성 이유로 인해 C ++ 클래스 유형이 아닙니다 .
귀하의 +
기호는 const char*
. 그 결과 포인터 산술이 발생합니다. 기본적 " is greater than "
되고 const char*
, 그 내용이다 ASCII 바이트 일부 메모리 버퍼에 대한 포인터이다 " is greater than "
. 추가의 효과 x
와 y
그것과는 버퍼의 끝을 가서 초기화되지 않은 메모리를 읽을 수있는 권리 35 바이트 포인터를 이동하는 것입니다. 그것이 나오는 "이상한 캐릭터"입니다. 올바르게 말하면 이것은 정의되지 않은 동작이므로 모든 일이 발생할 수 있습니다. 실제 시스템에서는 버퍼 오버 플로우 읽기가되어 횡설수설 문자가 발생합니다.
다른 사람들이 지적했듯이 이것을 수정하는 방법 std::to_string
은 정수 에 사용 하는 것입니다. 그런 다음 int + const char* + int
당신 대신에 std::string + const char* + std::string
훨씬 더 잘 처리됩니다.
이것이 명확하지 않은 경우 포인터, C 스타일 문자열 및 버퍼 오버플로를 찾아 더 많은 정보를 얻을 수 있습니다.
편집 : 기술적으로 말하는 문자열 리터럴은 const char[]
있지만 명확성을 위해 이것을 생략했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다