2016-09-29 8 views
1

Я просто просматривал свой C++. Я пытался сделать это:cout и String concatenation

#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 s и будет представлен как указатель. Вы добавляете 10 к указателю, указывающему, что хотите вывести его начиная с 11-го символа.

Нет оператора +, который преобразует число в строку и объединяет его в массив символов.

0

Перегруженный в этом случае оператор в этом случае не связывает любую строку, так как x является целым числом. В этом случае выход перемещается на время rvalue. Таким образом, первые 10 символов не печатаются. Проверьте this справка.

если вы будете писать

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

он будет работать

0

добавляя или приращение строки не увеличивает значение, которое она содержит, но его адрес:

  • это не проблема 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; 
    }