gpt4 book ai didi

c++ - 是否有一对正宽度和长度值会返回负面积?

转载 作者:行者123 更新时间:2023-12-03 07:11:00 27 4
gpt4 key购买 nike

我正在阅读 Bjarne Stroustrup 的《编程:使用 C++ 的原理与实践》第二版,他询问以下函数的后置条件在前置条件成功后如何会失败。

我想从技术上讲,它不必返回负值区域,但只要后置条件失败而前置条件成立即可。

这是第 5 章中有关错误的最后一个“尝试一下”。

有这样的一对吗?

int area(int length, int width)
// calculate area of rectangle
// pre-conditions: length and width are positive
// post-condtion: returns a positive value that is the area
{
if (length<=0 || width <=0) error("area() pre-condition");
int a = length*width;
if (a<=0) error("area() post-condition");
return a;
}

最佳答案

如果length * width的结果大于 int 的容纳范围,然后你会得到有符号整数溢出。通常,如果发生这种情况,人们会认为结果是否定的。然而,有符号整数溢出实际上是未定义行为(UB),因此不能保证结果为负数。或者,即使是,也不能保证 a <= 0实际上是true所以error()可能不会被调用,因为编译器可能假设 a永远不可能是负数。编译器可以自由地消除只能通过 UB 到达的分支。

不幸的是,这就是 UB 的本质。

关于c++ - 是否有一对正宽度和长度值会返回负面积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58228458/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com