std::string my_string = "";
char test = my_string[0];
我注意到这不会崩溃,每次我测试它时,test都是0。
我能保证它总是0吗?还是武断的?
这是糟糕的程序吗?
编辑:从一些评论中,我发现人们对这个功能的有用性存在一些误解。
这样做的目的是检查字符串是否为空。不需要检查字符串是否为空。
的情况是,有一个字符串可以为空,也可以不为空。我只关心这个字符串的第一个字符(如果它不是空的)。
在我看来,检查字符串是否为空,然后,如果它不为空,查看第一个字符,效率会降低。
if (! my_string.empty())
test = my_string[0];
else
test = 0;
相反,我可以只看第一个字符,而不需要检查字符串是否为空。
test = my_string[0];
c++ 14
没有;
在<<p> strong> 21.4.5.2 (或[string.access]),我们可以发现:返回:
*(begin() + pos)
如果pos < size()
。否则,返回对charT
类型对象的引用,其值为charT()
,修改该对象会导致未定义的行为。
换句话说,当 对于空字符串(或0大小的字符串)没有特殊大小写,对于每个长度都是相同的。 <子>和肯定 C + + 98。子> 看情况。 下面是来自官方ISO/IEC 14882的21.3.4.1: 返回:如果pos == size()
(当两者都为0时为真)时,操作符将返回对默认构造的字符类型的引用,该字符类型是禁止修改的。
c++ 03 pos < size()
,返回data()[pos]
。否则,如果pos == size()
, const版本返回charT()
。否则,行为是未定义的。
@Bartek Banachewicz的回答解释了哪些情况允许你做出假设。我想补充一下
这是一个糟糕的程序。
为什么?原因如下:
- 你必须是一个语言律师,以确保这不是一个错误。如果没有这个页面,我不知道答案,坦率地说,我认为你也不应该真的费心去知道。
- 没有字符串是一个以空结尾的字符序列的直觉的人将不知道你想做什么,直到他们阅读标准或询问他们的朋友。
- 以一种不好的方式打破了最少惊讶原则。
- 违背了"写你想写的"原则,即让代码表达问题域的概念。
- 类似于幻数的使用(在这种情况下,0是否真的构成幻数是有争议的)。
我要继续吗?…我几乎可以肯定,在各个方面,你都有另一位上司。我甚至会大胆猜测你做了其他"不好"的事情。操纵自己去做这件事。
永远记住:其他人,他们不会咨询你,迟早会需要维护这些代码。想想他们,而不仅仅是你自己,谁能弄清楚。另外,十年后,谁敢说你还记得自己的魔术呢?