c++ - 关于在 C++ 中使用“+”进行整数变量和字符串连接的非常基本的问题
问题描述
我是 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;
}
}
我的预期结果是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++ 类类型。
您的+
符号将整数添加到 a const char*
。这导致指针算术。基本上," is greater than "
作为 a const char*
,它是指向某个内存缓冲区的指针,其内容是 ASCII 字节" is greater than "
。添加x
and的效果y
是将指针向右移动 35 个字节,它将离开缓冲区的末尾并读取未初始化的内存。那就是出来的“奇怪的字符”。正确地说,这是未定义的行为,所以任何事情都可能发生。在实际系统中,这只是一个缓冲区溢出读取,导致乱码。
正如其他人所指出的,解决此问题的一种方法是std::to_string
在整数上使用。然后,而不是int + const char* + int
你会得到std::string + const char* + std::string
哪个处理得更好。
如果不清楚,您可以查找指针、C 样式字符串和缓冲区溢出以获取更多信息。
编辑:从技术上讲,字符串文字是,const char[]
但为了清楚起见,我省略了这一点。
推荐阅读
- swift - NSCollectionViewItems 不可见
- asp.net-core - 在 .net 中使用 Paypal REST api
- python - 在 python/numpy 中使用复数加速逐元素矩阵乘法
- python - matplotlib / seaborn 图的统计意义?
- python-3.x - ModuleNotFoundError:没有名为“message_board”的模块
- tsql - tsql 表值函数最佳实践
- c# - 在 c#.net 中为连接后的连接构建正确的 Linq 查询语法时遇到问题
- java - 将某些对象类型的集合转换为实现的接口类型集合
- azure - Azure Policy DeployIfNotExists:SQL 服务器的保留天数必须大于 X 天
- c# - 如何在 C# 中使用 PrintDocument 在热敏打印机中发送剪切命令