sách gpt4 ăn đã đi

Tại sao tôi thích start + (end - start)/2 hơn (start + end)/2 khi tính toán phần giữa của mảng?

In lại 作者:太空狗 更新时间:2023-10-29 16:14:13 27 4
mua khóa gpt4 giày nike

我见过程序员使用公式

mid = start + (end - start) / 2

而不是使用更简单的公式

mid = (start + end) / 2

用于查找数组或列表中的中间元素。

为什么他们使用前者?

câu trả lời hay nhất

有以下三个原因。

首先,start + (end - start) / 2即使您使用指针也可以工作,只要 end - start不会溢出1

int *start = ..., *end = ...;
int *mid = start + (end - start) / 2; // works as expected
int *mid = (start + end) / 2; // type error, won't compile

其次,start + (end - start) / 2nếu như bắt đầu 不会溢出和 kết thúc是大的正数。对于带符号的操作数,溢出是未定义的:

int start = 0x7ffffffe, end = 0x7fffffff;
int mid = start + (end - start) / 2; // works as expected
int mid = (start + end) / 2; // overflow... undefined

(Để ý end - start 可能溢出,但前提是 start < 0 hoặc end < 0 )

或者对于无符号算术,定义了溢出但给出了错误的答案。但是,对于无符号操作数,start + (end - start) / 2只要 end >= start 就永远不会溢出.

unsigned start = 0xfffffffeu, end = 0xffffffffu;
unsigned mid = start + (end - start) / 2; // works as expected
unsigned mid = (start + end) / 2; // mid = 0x7ffffffe

最后,您经常希望向 bắt đầu 舍入元素。

int start = -3, end = 0;
int mid = start + (end - start) / 2; // -2, closer to start
int mid = (start + end) / 2; // -1, surprise!

脚注

1 根据 C 标准,如果指针减法的结果不能表示为 ptrdiff_t ,则行为未定义。然而,在实践中,这需要分配一个 char至少使用整个地址空间一半的数组。

关于c - 为什么在计算数组的中间时更喜欢 start + (end - start)/2 而不是 (start + end)/2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38688028/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress