我遇到了这段代码:
std::string str; std::getline(std::cin, str); std::string sub = str.substr(str.find('.') + 1);
第一反应是 - 这是无效的代码.但经过一些想法似乎并不那么简单.那么它是有效的C++表达式(具有可预测的行为)吗?
PS如果不是那么清楚问题主要与'.'时会发生什么有关.不会被发现str
,但不限于此,因为可能存在其他问题.
str.find('.')
返回字符串中第一次出现的字符的索引.substr
with一个参数返回从给定索引开始的字符串的后缀.那么该行的作用是返回第一个点后面的字符串尾部.所以,如果str
是"hello.good.bye"
,sub
将会good.bye
.
然而,是潜在的代码问题,如果字符串不事实上包含任何圆点.它将返回整个字符串.这可能是也可能不是.发生这种情况是因为如果没有点,find
则返回npos
,这是std::string::size_type
可以容纳的最大数字.添加1
到它,你将得到0(这是无符号类型的行为,模2 n).
所以代码总是具有可预测的行为.