如何消去这个警告?

fallening 2008-11-06 02:36:04
写了个搜寻第n个元素的算法,有个警告在很烦心,不增加无意义代码的情形下,如何消去?

$ cat nth_element.cc && g++ -c nth_element.cc -Wall
void swap( int& a, int& b )
{
if ( a == b ) return;
a ^= b;
b ^= a;
a ^= b;
}

int partation( int* arr, int low, int high )
{
int ans = low - 1;
for ( int i = low; i < high; ++i )
{
if ( arr[i] < arr[high] )
{
swap( arr[i], arr[++ans] );
}
}
swap( arr[++ans], arr[high] );
return ans;
}
int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );
}
}

#include <iostream>
#include <iterator>
#include <algorithm>
#include <ctime>
using namespace std;

int main()
{
const int size = 99;
int arr[size];
for ( int index = 0; index < size; ++index )
arr[index] = index;

srand( time(0) );

random_shuffle( arr, arr+size );

copy( arr, arr+size, ostream_iterator<int>( cout, " " ) );
cout << endl;

cout << "the 73th element is " << nth( arr, 0, size-1, 73 ) << endl;

copy( arr, arr+size, ostream_iterator<int>( cout, " " ) );
cout << endl;

return 0;
}


nth_element.cc: In function ‘int nth(int*, int, int, int)’:
nth_element.cc:31: warning: control reaches end of non-void function
...全文
267 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fallening 2008-11-06
  • 打赏
  • 举报
回复
感谢参与:)
xxgamexx 2008-11-06
  • 打赏
  • 举报
回复

int nth( int* arr, int low, int high, int index )
{
if(mid==index)return arr[mid];
return mid<index?nth(arr,mid+1,high,index):nth(arr,low,mid-1,index);
}


呵呵~ 都揭贴了~
xxgamexx 2008-11-06
  • 打赏
  • 举报
回复
好美的代码~
学习了~

int nth( int* arr, int low, int high, int index )
{
if(mid==index)return arr[mid];
while(low<high)
return mid<index?nth(arr,mid+1,high,index):nth(arr,low,mid-1,index);
}

不知道这样可不可以?

MAlice 2008-11-06
  • 打赏
  • 举报
回复
值 的多种情况没有考虑周全。
fallening 2008-11-06
  • 打赏
  • 举报
回复
thx, 可能是我的错误了
bdshr 2008-11-06
  • 打赏
  • 举报
回复
再加一句,上面的还是会有那个问题,写成
if()

else if()

else

就ok了
bdshr 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fallening 的回复:]
引用 1 楼 xhs_lh04 的回复:
int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );
}
return 0;
}


问题在于return 0永远执行不到,而且…………
[/Quote]

如果确定 永远执行不到,也就是while( low < high ) 一直成立,
我觉得那个while就是多余的,这个循环只能执行一遍,不如直接把while去了,写成

int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );

好像程序流程也没什么变化
fallening 2008-11-06
  • 打赏
  • 举报
回复
直接void了
devil_zuiai 2008-11-06
  • 打赏
  • 举报
回复
1.函数返回值改成void,通过参数来返回得到的值?
好像C有的内部函数也有这样的效果。

2.如果while肯定成立,那能把
while改成
do
{
}while();
是否可行?
fallening 2008-11-06
  • 打赏
  • 举报
回复
有比较smart的建议么?
我觉得这段代码是比较elegant的了
void swap( int& a, int& b )
{
if ( a == b ) return;
a ^= b;
b ^= a;
a ^= b;
}

int partation( int* arr, int low, int high )
{
int ans = low - 1;
for ( int i = low; i < high; ++i )
{
if ( arr[i] < arr[high] )
{
swap( arr[i], arr[++ans] );
}
}
swap( arr[++ans], arr[high] );
return ans;
}

int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );
}
}

加个不相干的return xx;
显得十分难看,更会误导别人对nth这个函数的理解
cyj626 2008-11-06
  • 打赏
  • 举报
回复
return;
可以吗
yshuise 2008-11-06
  • 打赏
  • 举报
回复
  if ( mid == index ) return arr[mid];
else if ( mid < index ) return nth( arr, mid+1, high, index );
else if ( mid > index ) return nth( arr, low, mid-1, index );

  • 打赏
  • 举报
回复
直接把return 0 去掉
xhs_lh04 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fallening 的回复:]
引用 1 楼 xhs_lh04 的回复:
int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );
}
return 0;
}


问题在于return 0永远执行不到,而且…………
[/Quote]
呵呵编译器又不管会不会执行到哪里,它只检测你程序的分支有没有返回语句
Longinc 2008-11-06
  • 打赏
  • 举报
回复

int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );
}
}//加个return; 当low>=high 时 函数没有返回值
lionc650 2008-11-06
  • 打赏
  • 举报
回复
return 1啊
lann64 2008-11-06
  • 打赏
  • 举报
回复
最后再加一个return -1什么的
elephont9527 2008-11-06
  • 打赏
  • 举报
回复
在while后边加个return 0;
fallening 2008-11-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xhs_lh04 的回复:]
int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index )  return nth( arr, mid+1, high, index );
if ( mid > index )  return nth( arr, low, mid-1, index );
}
return 0;
}

[/Quote]
问题在于return 0永远执行不到,而且…………
xhs_lh04 2008-11-06
  • 打赏
  • 举报
回复
int nth( int* arr, int low, int high, int index )
{
while( low < high )
{
int mid = partation(arr, low, high);
if ( mid == index ) return arr[mid];
if ( mid < index ) return nth( arr, mid+1, high, index );
if ( mid > index ) return nth( arr, low, mid-1, index );
}
return 0;
}

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧