【发布时间】:2022-01-31 21:05:55
【问题描述】:
cout<<"ccccc"+2;
输出:
ccc
我尝试在网上搜索它,我知道这是一个非常愚蠢的问题,但在任何地方都找不到任何东西。请如果有人可以帮助我。
【问题讨论】:
-
这能回答你的问题吗? Why in the code "456"+1, output is "56"
cout<<"ccccc"+2;
输出:
ccc
我尝试在网上搜索它,我知道这是一个非常愚蠢的问题,但在任何地方都找不到任何东西。请如果有人可以帮助我。
【问题讨论】:
"ccccc"+2;
"ccccc" 衰减为引用字符串文字 "ccccc" 的第一个字符的 const char * 指针。当您向其添加2 时,结果将引用字符串文字的第三个元素。
同理:
const char *cptr = "ccccc";
cptr += 2;
cout << cptr;
【讨论】:
"ccccc" 衰减为 const char *。 char *cptr = "ccccc"; 应该给出编译时错误。
"cccc" 是 char[5]。我建议使用const char c[] = "cccc";。这也更类似于 OPs 代码中发生的事情,其中由于+ 2 而发生指针衰减
const char c[] = "cccc"; const char* cptr = c+2; 更接近于正在发生的事情,衰减是由 OPs 代码中的 +2 触发的
+2 而衰减,这就是我想说的
你写的时候:
cout<<"ccccc"+2;
会发生以下事情(这里要注意):
"ccccc" 是一个字符串文字。特别是,它的类型为const char[6]。
现在,由于类型衰减,这个字符串字面量衰减指向了一个指向const char的指针,它只不过是const char*。请注意,我们现在拥有的 decayed const char* 指向字符串文字的第一个字符。
接下来,2 被添加到该衰减指针的值中。这意味着现在,在添加2 之后,const char* 指向字符串文字的第三个字符。
使用此const char* 调用合适的重载operator<<。由于这个const char* 指向字符串文字的第三个字符,因此您会得到观察到的输出。
【讨论】: