一个程序三种写法, 请老鸟赐教哪种写法更好......

xiweiwei 2012-06-13 11:30:50
不久前刚做了一个项目,这两天在看effective C++,结合项目代码突然想到了一个问题,假如我要写一个函数,在函数内部我一般会检查参数的正确性,对于不同的参数,可能有不同的返回值,这个时候就会遇到到底在函数哪个部分去返回,我这儿以一个求字符串长度的函数说明情况...


这是第一种,做出判断后,如果条件出错,直接return......


int mystrlen(char *str)
{
int count = 0;
if (str == NULL)
{
return -1;
}

if (str == 0)
{
return 0;
}

while(str != 0 )
{
count++;
str++;
}
return count;
}




这是第二种,先设置一个变量,对变量赋值,只有一个return.....

int mystrlen(char *str)
{
int ret;
if (str == NULL)
{
ret = -1;
}
else if (str == 0)
{
ret = 0;
}
else
{
ret = 0;
while(str != 0 )
{
ret++;
str++;
}
}
return ret;
}



这是第三种,使用goto语句:


int mystrlen(char *str)
{
int ret;
if (str == NULL)
{
ret = -1;
goto _RET;
}

if (str == 0)
{
ret = 0;
goto _RET;
}


while(str != 0 )
{
ret++;
str++;
}

_RET:
return ret;
}




请大家讨论.....
...全文
4639 168 打赏 收藏 转发到动态 举报
写回复
用AI写文章
168 条回复
切换为时间正序
请发表友善的回复…
发表回复
品茶 2012-09-14
  • 打赏
  • 举报
回复

int mystrlen(char *str)
{
if (NULL == str)return -1;
if ('\0'== *str)return 0;

char *start = str;
while('\0' != *str)str++;
return (int)(str-start);
}
chenbin0522 2012-09-14
  • 打赏
  • 举报
回复
没有牵扯到内存回收,如果有的话,第三种方便,第二种代码多了乱,第一种也是重复代码多。
tianlaizhiyinyang 2012-09-14
  • 打赏
  • 举报
回复
第二种比第三种要好,个人倾向第二种。
stereoMatching 2012-09-14
  • 打赏
  • 举报
回复
>那天功能稍有变化,比如要扩充处理能力,函数头部的堆栈数组不够用,变成了malloc/new,这是什么后果?

C++有destructor,用物件管理资源就可以免掉goto的纠缠,至少meyers就是这么做的
至于物件和直接调用delete的可以做到没有开销上的差别,就看你怎么写
你说的情况比较适合纯C的情况,既然C++提供了destructor,再配合一个template
我们可以根据自己的需求写出类似std::unique_ptr这种smart pointer
让他尽可能达到"zero overhead"的效果
stereoMatching 2012-09-13
  • 打赏
  • 举报
回复
>当然,在嵌入式C和linux的一些驱动里,这种用法非常常见。但是在C++和应用程序里,好像还比较少看到这种用法,

一来是因为C++会抛异常
二来C++有destructor,所以只有很少很少的机会需要用到goto
wansbest 2012-09-13
  • 打赏
  • 举报
回复
倾向于3,1中当中函数返回出口太多,这个程序还有总共ret的值不多,但真正用的时候,ret的值可能有十几种可能,这时候函数有十几个出口。至于第二种,返回状态多的话也会变得复杂。第三种是标准的写法,是有尽量不要用goto的说法,那是因为goto打乱程序结构容易出错,但goto用在这儿,明显使得结构清晰。为什么不用?
codesnail 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
当然是第二种最佳。
[/Quote]
支持,以前公司的编程规约里明确规定,一个函数只能有一个return。
AngellMon 2012-06-26
  • 打赏
  • 举报
回复
按LZ的代码来看 我选第1种
酱油党 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 143 楼 的回复:]
直接看一看生成的汇编码的指令条数就知道哪一个效率高了
[/Quote]
这个是相对的,并不是说汇编指令的条数越多,执行的时间久越长,尤其是现在的处理器流水线深度越来越深的情况下!
YFLK 2012-06-26
  • 打赏
  • 举报
回复
我不会使用1,因为在一个函数中有多个返回点,这不好!函数简单还好些,复杂了维护很困难。
如果函数中GOTO语句只是起到返回作用,那3是最好的。
七擒关羽 2012-06-26
  • 打赏
  • 举报
回复
每个人的理念不同,追求的结果相同,何必去强迫彼此呢?

简单,明了,易懂,就可以了
Canvas 2012-06-25
  • 打赏
  • 举报
回复
效率来说,当然第一种,毫无疑问
jinchuan97 2012-06-25
  • 打赏
  • 举报
回复
代码写错了吧,能够用指针地址去做比较吗?
烟袅许伊 2012-06-24
  • 打赏
  • 举报
回复
个人觉得,稍微学过汇编的人,用GOTO都是再正常不过的事情,而且只要在GOTO没有破坏结构的情况下,用了只会加快程序效率。并且结构化编程,本来就直接导致了程序的复杂化,条理是一方面,不过条理并不能当饭吃。对于商业化的程序来讲,足够多的注释完全可以满足条理化的要求。如果是个人学习的程序,那就更没有条理的必要,因为我知道我自己写的程序哪里是做什么用的,在我眼里没有GOTO很条理,有GOTO依然条理。
[Quote=引用 19 楼 的回复:]

我能说你们都错了么, 以下是我在gcc下面的反汇编码

首先 写法1
.file "1.c"
.text
.p2align 4,,15
.globl mystrlen
.type mystrlen, @function
mystrlen:
pushl %ebp
movl……
[/Quote]
bugs2k 2012-06-24
  • 打赏
  • 举报
回复
为何不用 strlen ?
可见一斑 2012-06-24
  • 打赏
  • 举报
回复
[Quote=引用 83 楼 的回复:]

楼上几位不觉得写出所谓的“大型函数”,就已经输了么

优雅的函数都是一屏最多两屏能看完的,这时候用goto统一出口显然更优雅庚规律,函数规模大了,任何方法都很丑陋

再复杂的流程都不是写出千行函数的理由,那是印度的外包码农喜欢干的事情——千行的函数、万行的类,国内的北大青鸟学员深得其真传
[/Quote]

一个函数尽量不要超过10行,多写一些包裹函数是好习惯。
函数写了100行说明连最基本的面向过程编程都不会。
yuanpeirong 2012-06-23
  • 打赏
  • 举报
回复
个人觉得1比较好,运行次数会比较少
jiasi888 2012-06-23
  • 打赏
  • 举报
回复
1最好,1最容易读懂
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我不懂这个str == 0与str == NULL有什么区别?还请赐教
[/Quote]

我也有疑问,这两个不是一样的吗?退学NULL不是已经定义好的宏,即为0吗?
窗外蓝天 2012-06-23
  • 打赏
  • 举报
回复
goto没有教条说的那么可怕,适当地使用还是能够提高效率的。
加载更多回复(145)

64,635

社区成员

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

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