2016-09-29 20 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

この場合、+ overloaded演算子は、xが整数であるため、任意の文字列を連結しません。この場合、出力はrvalue回移動されます。したがって、最初の10文字は印刷されません。 thisの参照を確認してください。

あなたはそれを追加するか、それが含まれている値をインクリメントしない文字列をインクリメント

0

に動作します

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

を書きますが、それはアドレスだ場合:

  • 、それは問題ではありませんmsvc 2015または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; 
    }