#include <iostream>
int main()
{
std::cout << "25"+1;
return 0;
}
我得到&#34; 5&#34;作为输出。 当我使用&#34; 5&#34; + 1时,输出为空白;&#34; 456&#34; +1输出为&#34; 56&#34;。 混淆了幕后的情况。
答案 0 :(得分:50)
字符串文字"25"
实际上是类型const char[3]
的char数组,其值为{'2', '5', '\0'}
(您看到的两个字符和一个空终止符。)在C和C ++中,数组可以很容易衰减指向他们的第一个元素。这就是在这个表达式中发生的事情:
"25" + 1
其中"25"
衰减为&"25"[0]
,或指向第一个字符的指针。向1
添加5
可以指向std::ostream
。
最重要的是,std::cout
,其中const char*
是一个实例,打印char*
(注意5
也可以),假设它是null - 终止字符串。所以在这种情况下,它只打印{{1}}。
答案 1 :(得分:14)
在幕后,"25"
是一个包含三个字符的数组:两个代表'2'
和'5'
,以及一个值为零的终结符,用于标记结尾。
数组是一个有点奇怪的生物,如果你对它做任何事情,它倾向于变成指针(对第一个元素)。这就是在这里发生的事情:在一个数组中添加一个没有意义,所以它变成一个指针。添加一个给出指向第二个字符的指针。
当给出指向字符的指针时,<<
假定它指向一个终止的字符串,并保持打印字符,直到它找到一个终止符(或者以某种方式爆炸,如果没有终止符号)。所以给它一个指向字符串第二个字符的指针将打印出第二个字符开头的所有字符,就像你观察到的那样。
如果你是C和C ++的新手,你应该首先决定首先学习哪种语言,因为它们非常不同。如果你选择C ++,那么你应该熟悉它友好的高级库(例如std::string
处理没有这种奇怪的字符串),然后再陷入低级别的疯狂数组和指针。
答案 2 :(得分:2)
当您编写&#34;&#34;时,编译器会理解您正在放入一个字符串。在这种情况下,您正在使用函数cout,因此它在屏幕上打印此字符串。当您使用&#39; +&#39;时,您正在使用字符串。运算符,所以在将其发送到cout之前进行置换操作。