为什么在代码“456”+1,输出是“56”

#include <iostream> int main() { std::cout << "25"+1; return 0; } 

我得到“5”作为输出。 当使用“5”+ 1时,输出为空;“456”+1输出为“56”。 困惑幕后的事情。

string文字"25"实际上是一个types为const char[3]的char数组,其值为{'2', '5', '\0'} (您看到的两个字符和一个空终止符)。 C ++中,数组很容易衰减到第一个元素的指针。 这是在这个expression式中发生的事情:

 "25" + 1 

其中"25"衰变为&"25"[0] ,或指向第一个字符的指针。 加1就是给你一个指向5的指针。

最重要的是, std::ostream ,其中的std::cout是一个实例,通过假设它是一个以null结尾的string来打印一个const char* (注意char*也可以)。 所以在这种情况下,它只打印5

在幕后, "25"是一个由三个字符组成的数组:两个表示'2''5' ,终止符的值为零来标记结束。

一个数组是一个有点奇怪的生物,如果你对它做任何事情,有一种倾向变成一个指针(第一个元素)。 这就是这里发生的事情:向数组中添加一个没有意义,所以它变成了一个指针。 加一个给第二个字符的指针。

当给一个字符指针时, <<假定它指向一个已终止的string,并且一直打印字符直到find终止符(或者以某种方式爆炸,如果没有的话)。 所以给它一个指向string第二个字符的指针将会打印所有从第二个字符开始的字符。

如果你不熟悉C和C ++,首先应该先决定学习哪种语言,因为它们是非常不同的。 如果您selectC ++,那么在深入数组和指针的低级疯狂之前,您应该熟悉它友好的高级库(比如用于处理没有这种古怪的string的std::string ) 。

当你编写一个“”时,编译器明白你正在把一个string放在里面。 在这种情况下,你正在使用函数cout,所以它在屏幕上打印这个string。 当你使用'+'操作符时,你正在使用string,所以在发送给cout之前,你正在做一个位移操作。