为什么在 C++ 中,当我用 '+' 连接一个字符串时,它不会连接,而是删除字符串的第一个字符

Why in C++ when i concat a string with '+' like it don't concat but remove first char of the string

我在 java 6-7 年后学习 C++,我遇到了一个问题,在这个片段中,不是 "concat" 它只是删除了输入的 n 字符..

#include <iostream>
int main()
{
    int id;
    std::cin >> id;
    std::cout << "Hello world!" + id << std::endl;
    return 0;
}

输出不是

Hello world!*input*

而是减去 "hello world" 输入中给出的 n 个字符。如果我给 8,输出将是 rld!。 如果有人能解释这个……我会很高兴听到! =)

这就是指针算法在 C/C++ 中的工作方式。

基本上,"Hello world!" 只是一个 const char*,它的 + 运算符就像一个指针一样作用于它。这意味着,例如,如果您向其中添加 3,那么它不会指向 "Hello world" 的开头,而是指向开头后的 3 个字符。如果你打印它,你会得到 llo world.
所以你没有在那里进行字符串连接。

如果您只想打印这些东西,您可以使用 operator << 并改为执行以下操作:

std::cout << "Hello world!" << id << std::endl;

如果您需要一个真正像字符串一样工作的字符串,请考虑使用标准库中的 std::string,或者如果您使用 Qt 之类的东西,您可以使用 QString.

使用现代编译器(支持 C++11),您可以使用 std::to_stringint 创建一个字符串,然后您可以这样做:

std::string s = "Hello world!";
int i;
std::cin >> i;
s += std::to_string(i);
std::cout << s;

如果您考虑认真进行 C++ 应用程序开发,请考虑使用 Qt 或 boost 等库,这会让您的工作变得更加轻松,尽管熟悉标准库也是一件好事。 :)

"Hello world!" 在 C(C++ 的基础)中属于 const char[] 类型,当您尝试使用指针算术时,它会被视为 const char*。换句话说,它是一个内存地址,指向(比如)位置 OxDEAD0000,其中包含字符 "Hello world!" 和空终止符。

"Hello world!" + id 

因此解析(如果 id 为 8)为 0xDEAD0008

流运算符然后对该地址的内容进行操作,该地址是 "Hello world!" 中 8 个字符的偏移量 - 即 "rld!".

您可以使用 operator<<

std::cout << "Hello world!" << id << std::endl;

或者,如果您可以访问 C++11,则可以使用 std::to_string

std::cout << "Hello world!" + std::to_string(id) << std::endl;