C 为什么;中间=arr[(beg&x2B;end)/2]“;出问题了?

C 为什么;中间=arr[(beg&x2B;end)/2]“;出问题了?,c,C,我用c实现了quick\u select,但是我的代码出错了,我花了很长时间才找到原因,但我仍然无法理解 功能get\u pivot是为quick\u select找到一个pivot,下面是错误的代码: int get_pivot(int*arr, int beg, int end) { int middle = arr[(beg + end) / 2]; if (middle < arr[beg]) swap(&

我用c实现了
quick\u select
,但是我的代码出错了,我花了很长时间才找到原因,但我仍然无法理解

功能
get\u pivot
是为
quick\u select
找到一个pivot,下面是错误的代码:

int get_pivot(int*arr, int beg, int end)
{

    int middle = arr[(beg + end) / 2];                    
    if (middle < arr[beg])
      swap(&middle, &arr[beg]);
    if (arr[end] < arr[beg])
      swap(&arr[beg], &arr[end]);
    if (middle>arr[end])
      swap(&middle, &arr[end]);
    swap(&middle, &arr[end - 1]);
    return arr[end - 1];
}
我不明白为什么
intmiddle=arr[(beg+end)/2]出错


我真的很感谢你的帮助

由于这一行(以及后面类似的行),它出错了

middle
是一个单独的变量,使用上述方法交换时,数组中的实际元素(
array[middle]
)不会被交换(这是您需要的)


您想交换数组的索引
beg
中间
中的元素。这可以通过这样做来实现

swap(&arr[middle], &arr[beg]);

如果数组中包含的内容根本不能转换为
int
,那么问题就更明显了。如果是这样的话,前一段代码将无法编译,而拿铁咖啡将面临战斗的机会。此外,表达式还包含多个子表达式。以下哪一个子表达式没有您期望的值?您也可以这样写:swap(arr+middle,arr+beg);非常感谢!我会小心的@东星石,你明白问题所在吗?@Haris是的!我没有交换数组中的两个数字,只是交换了数组中的一个数字。@dongxingshi,是的。美好的享受编码乐趣。:)
swap(&middle, &arr[beg]);
swap(&arr[middle], &arr[beg]);