为啥在代码“456”+1中,输出是“56”[重复]
Posted
技术标签:
【中文标题】为啥在代码“456”+1中,输出是“56”[重复]【英文标题】:Why in the code "456"+1, output is "56" [duplicate]为什么在代码“456”+1中,输出是“56”[重复] 【发布时间】:2015-03-10 07:11:27 【问题描述】:#include <iostream>
int main()
std::cout << "25"+1;
return 0;
我得到“5”作为输出。 当我使用“5”+1 时,输出为空白;“456”+1 输出为“56”。 对幕后发生的事情感到困惑。
【问题讨论】:
当您执行“25”+1 时,您期望会发生什么? 而"hello" + 1
是"ello"
,你发现规律了吗?
如果你在香蕉里加土豆,你最终会得到多少个frobnitzes?
在开始使用 C++ 之前,您应该了解 C 风格的字符串。
对 php/javascript 程序员的好问题。
【参考方案1】:
字符串文字 "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
。
【讨论】:
【参考方案2】:在幕后,"25"
是一个由三个字符组成的数组:两个分别代表'2'
和'5'
,以及一个值为零的终止符来标记结束。
数组是一个有点奇怪的生物,如果你对它做任何事情,它就会变成一个指针(指向第一个元素)。这就是这里发生的事情:向数组添加一个没有意义,所以它变成了一个指针。向其中添加一个会给出一个指向第二个字符的指针。
当给定一个指向字符的指针时,<<
假定它指向一个终止的字符串,并一直打印字符直到它找到一个终止符(或以某种方式爆炸,如果没有终止符)。因此,如您所见,给它一个指向字符串第二个字符的指针将打印从第二个开始的所有字符。
如果您不熟悉 C 和 C++,您应该首先决定先学习哪种语言,因为它们非常不同。如果您选择 C++,那么您最好先熟悉其友好的高级库(例如 std::string
用于处理字符串而不会出现这种奇怪现象),然后再深入了解数组和指针的低级疯狂。
【讨论】:
@Mike Seymour: std::string s="25"+1;标准::cout @meet:当然可以。 “25”+1 无论你用它做什么都具有相同的含义。【参考方案3】:当你写一个“”时,编译器知道你在里面放了一个字符串。在这种情况下,您正在使用函数 cout,因此它会在屏幕上打印此字符串。当您使用“+”运算符时,您正在使用字符串进行操作,因此您在将其发送到 cout 之前进行了位移操作。
【讨论】:
错了。字符串文字是char*
而不是 std::string
@BasileStarynkevitch 公平地说,它没有说std::string
。此外,字符串文字是const char
的数组,而不是指针。
不确定const char
数组。我认为出于历史原因,标准中写着char
。
@BasileStarynkevitch 不是,他们是const char[]
。曾经有一个例外,即来自字符串字面量衰减的 const char *
可以分配给 char *
而无需强制转换。
置换操作?以上是关于为啥在代码“456”+1中,输出是“56”[重复]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的外部存储在 Android 7 中不可读写 [重复]