【问题标题】:Can someone please explain this output? [duplicate]有人可以解释一下这个输出吗? [复制]
【发布时间】:2022-01-31 21:05:55
【问题描述】:
cout<<"ccccc"+2;

输出:

ccc

我尝试在网上搜索它,我知道这是一个非常愚蠢的问题,但在任何地方都找不到任何东西。请如果有人可以帮助我。

【问题讨论】:

标签: c++ c++11 output cout


【解决方案1】:
"ccccc"+2;

"ccccc" 衰减为引用字符串文字 "ccccc" 的第一个字符的 const char * 指针。当您向其添加2 时,结果将引用字符串文字的第三个元素。

同理:

const char *cptr = "ccccc";

cptr += 2;

cout << cptr;

【讨论】:

  • 在 C++ 中,"ccccc" 衰减为 const char *char *cptr = "ccccc"; 应该给出编译时错误。
  • 不需要使用指针。 "cccc"char[5]。我建议使用const char c[] = "cccc";。这也更类似于 OPs 代码中发生的事情,其中​​由于+ 2 而发生指针衰减
  • @463035818_is_not_a_number 代码只是为了说明发生了什么。
  • 是的,显示 const char c[] = "cccc"; const char* cptr = c+2; 更接近于正在发生的事情,衰减是由 OPs 代码中的 +2 触发的
  • @mch 确实如此,但在 OPs 中,代码确实由于+2 而衰减,这就是我想说的
【解决方案2】:

你写的时候:

cout<<"ccccc"+2;

会发生以下事情(这里要注意):

  1. "ccccc" 是一个字符串文字。特别是,它的类型为const char[6]

  2. 现在,由于类型衰减,这个字符串字面量衰减指向了一个指向const char的指针,它只不过是const char*。请注意,我们现在拥有的 decayed const char* 指向字符串文字的第一个字符

  3. 接下来,2 被添加到该衰减指针的值中。这意味着现在,在添加2 之后,const char* 指向字符串文字的第三个字符

  4. 使用此const char* 调用合适的重载operator&lt;&lt;。由于这个const char* 指向字符串文字的第三个字符,因此您会得到观察到的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2011-09-29
    相关资源
    最近更新 更多