关于在 C++ 中使用“+”进行整数变量和字符串连接的非常基本的问题
Very basic question on integer variable and string concatenation using "+" in C++
我是 C++ 的新手,这个问题对很多人来说可能看起来微不足道,但请记住,我才刚刚开始学习 C++ 语言。
我已将变量 x
分配给等于 20
并希望将其与字符串连接起来。我的 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;
}
}
我的预期结果是 20 is greater than 15
,但结果却有些奇怪 é@
。我很困惑,我无法在 GeeksForGeeks、w3schools 或其他 SO 上找到解决方案。
我知道使用 cout << x << " is greater than " << y;
工作得很好,但我不确定为什么串联在这里不起作用。还有,为什么会出现这些奇怪的字符呢?
提前致谢。
(此外,请不要在没有回答问题的情况下留下答案。我记得在开始 JS 时我问了一个问题,唯一的答案是“不要使用 document.write
”。虽然我明白了,实际 回答 问题并将其作为旁注会更好。)
你得到一些奇怪的输出的原因是 C++ 历史的一部分是 C 的演变。在表达式 x + " is greater than " + y
中,表达式 " is greater than "
是一个 const char*
文字,它是一个原始 C 风格类型。由于向后兼容的原因,它不是像 std::string
这样的 C++ class 类型。
你的 +
符号将整数加到 const char*
。这导致指针算术。基本上," is greater than "
是一个 const char*
,它是指向内存缓冲区的指针,其内容是 " is greater than "
的 ASCII 字节。添加 x
和 y
的效果是将指针向右移动 35 个字节,它将离开缓冲区的末尾并读取未初始化的内存。那就是出来的“奇数字符”。正确地说,这是未定义的行为,所以任何事情都可能发生。在实际系统中,虽然这只是缓冲区溢出读取导致乱码。
正如其他人指出的那样,解决此问题的一种方法是对整数使用 std::to_string
。然后,而不是 int + const char* + int
你会得到 std::string + const char* + std::string
处理得更好。
如果不清楚,您可以查找指针、C 风格字符串和缓冲区溢出以获取更多信息。
编辑:从技术上讲,字符串文字是 const char[]
,但为了清楚起见,我省略了这一点。
我是 C++ 的新手,这个问题对很多人来说可能看起来微不足道,但请记住,我才刚刚开始学习 C++ 语言。
我已将变量 x
分配给等于 20
并希望将其与字符串连接起来。我的 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;
}
}
我的预期结果是 20 is greater than 15
,但结果却有些奇怪 é@
。我很困惑,我无法在 GeeksForGeeks、w3schools 或其他 SO 上找到解决方案。
我知道使用 cout << x << " is greater than " << y;
工作得很好,但我不确定为什么串联在这里不起作用。还有,为什么会出现这些奇怪的字符呢?
提前致谢。
(此外,请不要在没有回答问题的情况下留下答案。我记得在开始 JS 时我问了一个问题,唯一的答案是“不要使用 document.write
”。虽然我明白了,实际 回答 问题并将其作为旁注会更好。)
你得到一些奇怪的输出的原因是 C++ 历史的一部分是 C 的演变。在表达式 x + " is greater than " + y
中,表达式 " is greater than "
是一个 const char*
文字,它是一个原始 C 风格类型。由于向后兼容的原因,它不是像 std::string
这样的 C++ class 类型。
你的 +
符号将整数加到 const char*
。这导致指针算术。基本上," is greater than "
是一个 const char*
,它是指向内存缓冲区的指针,其内容是 " is greater than "
的 ASCII 字节。添加 x
和 y
的效果是将指针向右移动 35 个字节,它将离开缓冲区的末尾并读取未初始化的内存。那就是出来的“奇数字符”。正确地说,这是未定义的行为,所以任何事情都可能发生。在实际系统中,虽然这只是缓冲区溢出读取导致乱码。
正如其他人指出的那样,解决此问题的一种方法是对整数使用 std::to_string
。然后,而不是 int + const char* + int
你会得到 std::string + const char* + std::string
处理得更好。
如果不清楚,您可以查找指针、C 风格字符串和缓冲区溢出以获取更多信息。
编辑:从技术上讲,字符串文字是 const char[]
,但为了清楚起见,我省略了这一点。