在 C++ 中使用“+”进行整数变量和字符串连接的非常基本的问题

Fru*_*uDe 3 c++ string int concatenation

我是 C++ 新手,这个问题对很多人来说可能看起来微不足道,但请记住,我刚刚开始学习 C++ 语言。

我已将一个变量分配x给 equal20并想将它与一个字符串连接起来。我的 C++ 代码如下。

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
  int x = 20;
  int y = 15;
  if (x >= y) {
    cout << x + " is greater than " + y;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的预期结果是20 is greater than 15,但结果却有些奇怪é@。我很困惑,我在 GeeksForGeeks、w3schools 或 SO 的其余部分找不到解决方案。

我知道使用cout << x << " is greater than " << y;效果很好,但我不确定为什么连接在这里不起作用。另外,为什么这些奇怪的字符会出现?

提前致谢。

(另外,请不要不回答这个问题留下一个答案。我记得开始的时候JS我问一个问题,唯一的答案是“不使用document.write。”虽然我得到的,它会是更好的选择实际上回答了问题并将其作为旁注。)

jca*_*cai 5

你得到一些奇怪的输出的原因是 C++ 历史的一部分是 C 的演变。在表达式中x + " is greater than " + y,表达式是一个原始 C 风格类型" is greater than "const char*文字。std::string由于向后兼容的原因,它不是 C++ 类类型。

您的+符号将整数添加到 a const char*。这导致指针算术。基本上," is greater than "作为 a const char*,它是指向某些内存缓冲区的指针,其内容是 的 ASCII 字节" is greater than "。添加x和的效果y是将指针向右移动 35 个字节,它将离开缓冲区的末尾并读取未初始化的内存。那就是出来的“奇数”。正确地说,这是未定义的行为,因此任何事情都可能发生。在实际系统中,这只是导致乱码字符的缓冲区溢出读取。

正如其他人所指出的,解决这个问题的一种方法是std::to_string在整数上使用。然后,而不是int + const char* + int你会得到std::string + const char* + std::string哪个处理得更好。

如果这不清楚,您可以查找指针、C 样式字符串和缓冲区溢出以获取更多信息。

编辑:从技术上讲,字符串文字是,const char[]但为了清楚起见,我省略了这一点。