2017-02-10 55 views
2

我在parC中遇到了这个代码。parC int分区向上舍入

enter image description here

enter image description here

我不明白其中的场景(黄色标记),它可以发生? 我的意思是什么时候分区的结果可以四舍五入当值类型是诠释

回答

2

我对parC一无所知,但就C而言,你是对的:正值的整数除法被定义为截断小数部分,即舍入为零。

但是,代码中存在另一个错误:如果数组太长,则中点可能计算错误。

准确地说,如果初始to是大2或大于最大值的可表示的一半在int类型(INT_MAX),然后递归调用中的一个将得到fr, to值都大于(INT_MAX/2)和表达式(to+fr)将导致算术溢出。 (to+fr)/2的结果将小于fr/2

为避免这种情况,推荐使用如fr + (to - fr)/2这样的表达式,而不是(to + fr)/2

编辑

也有描述错误!查看图片:

enter image description here

(4,5)→(4,5)递归发生一个级别早于作者指出,这样一个子树不应该实际出现在图中。另外,如果程序卡在红色箭头循环中,则(6,5)递归永远不会发生 - 该进程将永远不会到达该分支。

有趣的是,作者显然忽略了另一个循环出现在他们的图画中;
递归(1,2)→(1,2)甚至早于上述这两个出现:

enter image description here

作为边注,我无法想象他们是如何获得的划分的两种不同的结果(4,5)→(4,5)+(6,5)和(4,5)→(4,5)+(5,5)
(见绿框)。可能他们是如此专注于强迫思考,忽略了关于问题所有其他方面的任何推理。

基于这个例子,我建议把这本书放在垃圾桶里。

1

你说得对,C中正操作数的整数除法总是四舍五入至分区的楼层,查询this question了解更多细节。我对parC不熟悉,但据说它是full C++ language以及来自其他语言的附加内容,所以描述的任务似乎不正确。

如果还有问题,您总是有机会直接检查任务:为parC设置environment,执行rsum()并执行rsum(A, 1, 5)

1

您可能正在阅读的文字大于18年。 在旧版本的C标准中,负操作数的除法可以以实现定义的方式进行四舍五入:向下或向上。这意味着-3/2可能会给你-1-2取决于编译器。

这被认为是该语言的设计缺陷,并已通过C99标准进行了修正。如今,无论编译器如何,C总是使用“截至零”。

+0

有趣的版本,但图2.17显示了积极操作数的无穷递归,所以情况并非如此。 –