为什么可以在任何位置访问C ++空字符串而不会出错?
例如,
string str("");
str[1]
,str[2]
将返回空。
为什么以下语句没有抛出错误?
str[2] = 'a'
但是,打印出str
仍显示空字符串。
我在这里很困惑,可能会错过一些东西。
答案 0 :(得分:4)
未定义访问超出范围的下标。对于空std::string
,使用任何下标都是非法的。
但是,库不需要检查下标的值。确保下标合法的工作留给程序员,即你。
答案 1 :(得分:3)
这个字符串是(一种)你可以粘贴的字符数组。当你制作它时,""它保证长度至少 0个字符可用。当你为角色[2]分配一些东西时,行为是不确定的,并且它有权被炸毁,但是它很有可能在不注意的情况下吸收你的错误...
答案 2 :(得分:2)
std::string
运算符并使用[]
函数访问 at()
个元素。运算符不需要执行边界检查,就像在C ++中使用常规数组访问一样,而函数会为无效索引抛出out_of_range
。
答案 3 :(得分:2)
除了Yu和Andy的回答,当然这是正确的,我想指出string::at
,string::operator[]
不像#include <string>
int main()
{
std::string s("");
return s.at(1);
}
那样会检查并通过异常进行检查尝试越界访问:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::at
Aborted (core dumped)
输出:
SELECT
DerivedAllLRS_IDs.LRS_ID,
COALESCE([Table 1].AGENCY_ID, [Table 2].AGENCY_ID) AS AGENCY_ID,
COALESCE([Table 1].LOCAL_ID, [Table 2].LOCAL_ID) AS LOCAL_ID,
COALESCE([Table 1].CLASS, [Table 2].CLASS) AS CLASS
FROM
(
SELECT DISTINCT
LRS_ID
FROM
(
(SELECT LRS_ID FROM [Table 1])
UNION ALL
(SELECT LRS_ID FROM [Table 2])
)DerivedUnion
) DerivedAllLRS_IDs
LEFT OUTER JOIN [Table 1] ON DerivedAllLRS_IDs.LRS_ID = [Table 1].LRS_ID
LEFT OUTER JOIN [Table 2] ON DerivedAllLRS_IDs.LRS_ID = [Table 2].LRS_ID