sách gpt4 ai đã đi

C++: vector 边界

In lại 作者:可可西里 更新时间:2023-11-01 14:56:03 28 4
mua khóa gpt4 Nike

我来自 Java,目前正在学习 C++。我正在使用 Stroustrup 的 Progamming Principles and Practice of Using C++。我现在正在使用 vector 。在第 117 页上,他说访问 vector 的不存在元素将导致运行时错误(在 Java 中相同,索引越界)。我正在使用 MinGW 编译器,当我编译并运行这段代码时:

#include 
#include
#include

int chính()
{
std::vector v(6);
v[8] = 10;
std::cout << v[8];
trả về 0;
}

它给我作为输出 10。更有趣的是,如果我不修改不存在的 vector 元素(我只是打印它期望运行时错误或至少一个默认值)它会打印一些大整数。那么...是 Stroustrup 错了,还是 GCC 有一些奇怪的编译 C++ 的方法?

1 Câu trả lời

这本书有点含糊。这与其说是“运行时错误”,不如说是在运行时出现的未定义行为。这意味着任何事情都可能发生。但错误完全是,而不是程序执行,事实上,甚至谈论具有未定义行为的程序的执行是不可能的,也是不明智的。

与 Java 完全不同,C++ 中没有任何东西可以保护您免受编程错误的侵害。


正如@sftrabbit 所说,std::vector 有一个替代接口(interface),.at() ,它总是给出一个正确的程序(尽管它可能会抛出异常),因此是一个可以推理的程序。


让我用一个例子来重复这一点,因为我相信这是 C++ 的一个重要的基础方面。假设我们正在从用户那里读取一个整数:

int read_int()
{
std::cout << "Please enter a number: ";
int n;
return (std::cin >> n) ? n : 18;
}

现在考虑以下三个程序:

危险的:这个程序的正确性取决于用户的输入!它不一定不正确,但它不安全(到了我称之为损坏的程度)。

int chính()
{
int n = read_int();
int k = read_int();
std::vector v(n);
return v[k];
}

无条件正确:无论用户输入什么,我们都知道这个程序的行为。

int main() try
{
int n = read_int();
int k = read_int();
std::vector v(n);
return v.at(k);
}
catch (...)
{
trả về 0;
}

理智的上面带有.at() 的版本很尴尬。最好检查并提供反馈。因为我们进行了动态检查,所以未经检查的 vector 访问实际上保证没问题。

int chính()
{
int n = read_int();

if (n <= 0) { std::cout << "Bad container size!\n"; return 0; }

int k = read_int();

if (k < 0 || k >= n) { std::cout << "Bad index!\n"; return 0; }

std::vector v(n);
return v[k];
}

(我们忽略了 vector 构造可能抛出自身异常的可能性。)

道德是 C++ 中的许多操作是不安全的并且只有条件正确,但是程序员应该提前进行必要的检查。语言不会为你做,所以你不用为此付出代价,但你必须记住去做。这个想法是你无论如何都需要处理错误情况,所以与其在库或语言级别强制执行昂贵的、非特定的操作,不如将责任留给程序员,他们可以更好地集成检查进入无论如何都需要编写的代码。

如果我想开玩笑的话,我会将这种方法与 Python 进行对比,Python 允许您编写令人难以置信的简短Chính xác 程序,而无需任何用户编写的错误处理根本。不利的一面是,任何试图使用这样一个程序的尝试,只要稍微偏离了程序员的意图,就会给您留下一个非特定的、难以阅读的异常和堆栈跟踪,并且几乎没有什么指导你应该做得更好。您不必编写任何错误处理程序,而且通常最终不会编写任何错误处理程序。 (我无法将 C++ 与 Java 进行比较,因为虽然 Java 通常Sự an toàn,但我还没有看到简短 Java 程序。)

关于C++: vector 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14015632/

28 4 0
可可西里
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com