cout 和字符串文字与 int 的连接

问题描述 投票:0回答:3

我刚刚复习我的 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
函数中。当我运行它时,输出中省略了“My favorite number is”中的前 10 个字符。输出是“e number is”。连号码都没有显示出来。

解决这个问题的方法就是这样做

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

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

c++ iostream string-concatenation
3个回答
11
投票

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

如果你愿意写的话

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

会起作用的


4
投票

这是简单的指针算术。字符串文字是一个数组或

char
并将显示为指针。您将 10 添加到指针,告诉您要从第 11 个字符开始输出。

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


1
投票

添加或增加字符串不会增加其包含的值,但会增加地址:

  • 这不是 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;
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.