【问题标题】:In C++: If we add some integer to string, why does it removes that number of characters from the beginning? (string + int) [duplicate]在 C++ 中:如果我们在字符串中添加一些整数,为什么它会从开头删除那个数量的字符? (字符串+整数)[重复]
【发布时间】:2024-01-21 20:30:01
【问题描述】:

这是我的程序!我想知道这种输出背后的原因。

#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;
}

预期输出: 你好世界2

实际输出: 你的世界

PS:要打印“HelloWorld2”,我也可以编码cout

【问题讨论】:

  • 预期输出:Hello World2 -- 您正在寻找 Java,而不是 C++。 -- 我也可以编写 cout -- 这是在 C++ 中执行此操作的正确方法。
  • 从 C++14 开始,您可以使用 "Hello World"s + i。在 C++11 中,可以使用 user-defined literal 完成类似的事情
  • @LưuVĩnhPhúc 应该是 "Hello Worls"s + std::to_string(i) 而不是 UB。

标签: c++ string char int add


【解决方案1】:

"Hello World" 不是std::string,它是一个字符串文字,所以它的类型是const char[]。当像使用 i 一样添加整数时,实际上是在创建一个临时的 const char*,它首先指向 const char[] 的第一个元素,即“H”,然后将其移动 2 个点(因为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.

请注意,如果您尝试过多地“移动”指针以使其指向字符串外的某些内容,然后尝试访问该指针,您会得到未定义的行为。与 UB 越界访问数组的方式相同。只需确保index &lt; size

【讨论】:

  • 向右移动两个点给出“llo World”,正如问题中所观察到的(没有i-1发生)
  • @chtz mhm,正在编辑,谢谢。
  • @GillBates 谢谢你的回答。它真的帮助我深入了解!
【解决方案2】:

"Hello World" + i 不进行字符串连接。它进行指针运算。

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

但是,如果它在界限内,您将在文字中获得一个地址,该地址在打印时将显示为后缀。但是,由于 c 字符串文字是 const,因此再次尝试写入该地址是 UB。

长话短说,不要这样做。

【讨论】:

    【解决方案3】:

    "Hello World" 被编译为一个字符数组,并作为指向这些字符的指针传递给 operatori 添加到指针上,这会将指针移动到那么多字符上。

    【讨论】:

      【解决方案4】:

      指针算法。

      "Hello World" 是一个字符串,由 const char* 隐式指向。

      将整数 i 添加到指针会将其 i positions 向前移动(如果 i

      因此"Hello World" + 2 的结果是一个常量指针(const char*),指示字符串中第三个字母的地址。

      【讨论】:

        最近更新 更多