为什么在代码“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之前,你正在做一个位移操作。