cout和String连接

时间:2016-09-29 00:27:06

标签: c++ iostream string-concatenation

我只是在回顾我的C ++。我试着这样做:

#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函数中。当我运行它时,输出中省略了&#34;我最喜欢的数字是&#34;的前10个字符。输出是&#34; e number是&#34;。这个数字甚至都没有出现。

解决这个问题的方法是

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

我想知道计算机/编译器在幕后做了什么。

3 个答案:

答案 0 :(得分:3)

它是简单的指针算法。字符串文字是一个数组或char,并将显示为指针。将10添加到指针,告诉您要从第11个字符开始输出。

没有+运算符可以将数字转换为字符串并将其连接到char数组。

答案 1 :(得分:1)

在这种情况下,+重载运算符不连接任何字符串,因为x是整数。在这种情况下,输出移动了右值时间。所以前10个字符不打印。查看this参考。

如果你要写

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

它会起作用

答案 2 :(得分: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;
    }