C++ 在C++;:如果我们向字符串中添加一些整数,为什么它会从开头删除那个数量的字符?(字符串+;int)

C++ 在C++;:如果我们向字符串中添加一些整数,为什么它会从开头删除那个数量的字符?(字符串+;int),c++,string,char,int,add,C++,String,Char,Int,Add,这是我的节目!我想知道这种输出背后的原因 #include <iostream> using namespace std; class A{ public: void fun(int i){ cout<<"Hello World" + i<<endl; } }; int main() { A obj1; obj1.fun(2); return 0; } #包括 使用名称空间std; 甲级{ 公

这是我的节目!我想知道这种输出背后的原因

#include <iostream>
using namespace std;

class A{
  public:
      void fun(int i){
          cout<<"Hello World" + i<<endl;
      }
};

int main()
{
  A obj1;
  obj1.fun(2);

  return 0;
}
#包括
使用名称空间std;
甲级{
公众:
虚无乐趣(int i){
cout
“Hello World”+i
不执行字符串连接。它执行指针算术

它采用c字符串的地址
“Hello World”
,我们称它为
a
。 然后将其添加到
a+i
。当
i
大于c字符串文本的长度时,取消引用结果指针是未定义的行为

但是,如果它在范围内,您将在文本中获得一个地址,该地址在打印时将显示为后缀。然而,由于c字符串文本是
const
,因此再次尝试写入该地址是错误的

长话短说,不要这样做。

“Hello World”
被编译成一个字符数组并传递给操作符
“Hello World”
不是
std::string
,它是一个字符串文本,因此它的类型是
常量字符[]
。当添加一个整数时,就像你在这里对
i
所做的那样,你实际上是在创建一个临时的
const char*
,它首先指向
const char[]
的第一个元素,即“H”,然后将它移动两个点(因为
i
是2)它指向“l”,然后你把指针传递给
cout
,这样
cout
就从“l”开始打印。对这些类型进行二进制运算称为指针算术

为了更好地理解示例
char
数组,您的代码如下所示:

const char myHello[] = "Hello World";
const char* pointer = myHello; // make pointer point to the start of `myHello`
pointer += i; // move the pointer i spots
cout<< pointer <<endl; // let cout print out the "string" starting at the character pointed to by the new pointer.
const char myHello[]=“Hello World”;
const char*pointer=myHello;//使指针指向“myHello”的开头`
指针+=i;//移动指针i
指针算法

“Hello World”
是一个字符串,由
常量char*
隐式指向


添加一个整数<代码> i <代码>指针将移动它>代码> i或代码>向前(或向后)如果我预期输出:Hello Wor2—你正在寻找java,不是C++。我也可以编码Cube,因为C++ 14可以使用。在C++ 11中,类似的事情可以用@ L uVuxnHPH C来完成,它应该是代码>“你好Word”s+STD::toSype串(i)

不要成为UB。将两个点移到右边会产生“llo世界”,正如问题中所观察到的(没有
i-1
发生)@chtz-mhm,正在编辑,谢谢。@GillBates谢谢你的回答。它真的帮助我深入理解!