2016-09-29 4 views
1

저는 C++을 검토하고있었습니다. 나는 이것을 시도했다 :cout 및 문자열 연결

#include <iostream> 

using std::cout; 
using std::endl; 

void printStuff(int x); 

int main() { 
    printStuff(10); 
    return 0; 
} 

void printStuff(int x) { 
    cout << "My favorite number is " + x << endl; 
} 

printStuff 기능에서 문제가 발생합니다. 내가 그것을 실행할 때, "나의 마음에 드는 수는이다"에서 첫번째 10의 특성은, 산출에서 생략된다. 출력은 "e number is"입니다. 번호가 표시되지 않습니다.

이 문제를 해결하는 방법은 내가 컴퓨터/컴파일러가 무대 뒤에서 무엇을하는지 궁금

void printStuff(int x) { 
    cout << "My favorite number is " << x << endl; 
} 

하는 것입니다.

답변

3

간단한 포인터 연산입니다. 문자열 리터럴은 배열 또는 char이고 포인터로 표시됩니다. 11 번째 문자부터 시작하여 출력을 지시하는 포인터에 10을 추가합니다.

숫자를 문자열로 변환하고이를 문자 배열에 연결하는 + 연산자가 없습니다.

0

이 경우 + 오버로드 된 연산자는 x가 정수이므로 모든 문자열을 연결하지 않습니다. 출력은이 경우 rvalue 시간만큼 이동합니다. 따라서 처음 10 자는 인쇄되지 않습니다. 참조 번호 this을 확인하십시오.

당신이 추가하거나 포함 된 값을 증가하지 않는 문자열을 증가

0

작동합니다

cout << "My favorite number is " + std::to_string(x) << endl; 

를 작성합니다하지만 주소 인 경우 :

  • 그것의 문제가 아니에요 msvc 2015 또는 cout 대신에 메모리에서 뒤로/앞으로 이동 : 당신에게 그에게 cout은 무죄임을 증명합니다 :

    #include <iostream> 
    using std::cout; 
    using std::endl; 
    
    int main() 
    { 
    
        char* str = "My favorite number is "; 
        int a = 10; 
    
        for(int i(0); i < strlen(str); i++) 
        std::cout << str + i << std::endl; 
    
        char* ptrTxt = "Hello"; 
        while(strlen(ptrTxt++)) 
         std::cout << ptrTxt << std::endl; 
    
        // proving that cout is innocent: 
    
        char* str2 = str + 10; // copying from element 10 to the end of str to stre. like strncpy() 
        std::cout << str2 << std::endl; // cout prints what is exactly in str2 
    
        return 0; 
    }