为什么我在使用未定义的索引时没有收到错误?

Via*_*iuk -1 php c++ indexing

我来自php和当我定义这样的东西时:

$a = array();
echo $a[586];
Run Code Online (Sandbox Code Playgroud)

我将收到有关未定义索引的通知.

与此同时,c++我可以这样做:

map<int, string> my_map;
cout << "Map is: " << my_map[34535];

string sentence = "acdefb s";
cout << "Letter is: " << sentence[15];
Run Code Online (Sandbox Code Playgroud)

我不会有任何错误.

为什么php不可能在c++

Cha*_*via 7

因为PHP和C++是两种截然不同的语言,具有完全不同的语义.在C++中使用[]带有std::map对象的运算符时,如果映射中的键尚不存在,则会将新元素插入到映射中.在PHP中,情况并非如此.

至于你与第二个例子std::string sentance,它是有效使用[]操作者具有无效索引(索引是>= sentance.length()上一个)std::string在C++中.您可能不会收到任何"错误",因为使用无效索引的结果std::string未定义的行为,这意味着任何事情都可能发生.现代平台上的一个常见结果是分段错误/访问冲突,这通常会导致程序崩溃.

有了std::string您可以使用std::string::at()替代的[]经营者,如果你想对不确定的行为保护.如果使用无效索引,该at函数会执行边界检查和抛出std::out_of_range.