请教各位:C语言中return语句的用法? 怎样才能理解透彻呢?

msdner 2003-10-04 02:49:29
return 后面是不是一定要接一个数值呢?

如:
return true;(这里的true相当于1)
return false; (这里的true相当于0)

#define csdn 1
return csdn;

如果函数的返回类型不是VOID一定要用到return语句。这时return语句返回的数据对主函数可能是有用的,也可能是没有用的。如果是没用的,为什么还要返回一个数据呢?有什么作用呢?是不是通知编译器,已经完成了函数调用?请各位大侠指点,谢谢。



...全文
5640 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
TianGuangZao 2003-10-05
  • 打赏
  • 举报
回复
打字急了点:
#ifndef SUCCESS
#define SUCCESS 1
#endif
TianGuangZao 2003-10-05
  • 打赏
  • 举报
回复
其实从子函数 thankyou 返回 1 和 0 还是负数,如 -1,其中的 1 ,0 ,或 -1 具体代表是成功还是失败,还是其他特定的含义,完全是人为定义的。
其实程序如果能执行到 return, 就是成功的,但这并不代表程序没有逻辑错误。
对于 main 函数,一般上都约定 return 0 表示成功(抱歉,上面 1 是我说错了),负整数表示中间可能出现了某些问题。这个以后你接触多了,慢慢会理解的。

return true/1;
千万不要写成这个样子,它看上去是多么糟糕,这是语法错误。

更重要的是你要理解 FALSE/TRUE 与 false/true 的区别:
false/true 是标准 C++ 语言里新增的关键字,代表布尔类型,它和整型完全不同,ANSI C 是没有这种数据类型的。
FALSE/TRUE 是通过 #define 定义的常量,是 int 类型,一般常量都用大写字母表示。
之所以区分大小写是解决程序在C与C++中环境的差异,可以如下定义 FALSE/TRUE:
#ifndef TURE
#define TURE 1
#endif

#ifndef FALSE
#define FALSE 0
#endif
一般上库函数的头文件里都是定义好的。

所以正确的写法是
return TURE;
return FALSE;

不过在你给的例子里,写成 TURE 或 FALSE 也是很可笑的。
直接用 return 1; 或 return 0; 好了。
表示成功我们习惯用 SUCCESS,更能表义,TURE 反而让人误解。
#ifndef SUCCESS
#define SUCCESS 0
#endif
msdner 2003-10-05
  • 打赏
  • 举报
回复
好,谢谢TianGuangZao(天光早),终于明白了一些了。小弟刚学的C语言,还有好多问题不清楚,以后请多多指教,谢谢。
msdner 2003-10-04
  • 打赏
  • 举报
回复
很感谢 TianGuangZao(天光早) ,我渐渐明白了一些了,谢谢。还要请教你一个问题:下面程序中的两条语句(一般true/1 表示程序执行成功,false/0 表示失败)对于这个例子来讲,效果是一样的。
'################
int thankyou(void)
{
printf("hello\n");
return true/1;
printf("world!\n");
}
'################

return true;
return false;

原理是什么呢?请指教,谢谢。


TianGuangZao 2003-10-04
  • 打赏
  • 举报
回复
return 语句返回的数据类型和 thankyou 前的返回类型应该保证一样,这是最基本的要求。

如果你不需要从 thankyou 函数返回任何值:
#include <stdio.h>
void thankyou(void);
void main(void)
{
puts("......");
thankyou();
}
void thankyou(void)
{
printf("\n......\n\n\n");
}
写成上面这样。
在这个例子中花括号 } 代表了函数结束,也就是说当 printf("\n......\n\n\n"); 完毕,执行到 } 时函数结束,返回调用点。

再看一个例子:
#include <stdio.h>
int thankyou(void);
void main(void)
{
puts("......");
thankyou();
}
int thankyou(void)
{
printf("hello\n");
return 1;
printf("world!\n");
}
结果:
......
hello
这个例子中,执行到 return 1; 时提前返回,至于返回值为多少,可以自己定义,这里我定义为整数1。

还有我讲过很多数遍了,return 是返回给调用函数,也可以理解为告诉调用函数被调用函数已经结束,但是和编译器是根本没有任何关系,一点都没有。
因为这时候的程序已经不是写在纸上的代码,而是运行在操作系统下已经编译好的二进制代码,或者称之为进程,早就脱离了编译器。

概念模糊是非常可怕的事情。

“RETURN后面如果要接表达式的话,是不是一定要接受一个数值型的?”
不一定。
return 前先计算表达式的结果,然后返回结果。
表达式的结果可以是数值,指针等。
c++ 中还可以返回布尔型。
msdner 2003-10-04
  • 打赏
  • 举报
回复
UP一下,大家继续探讨~
msdner 2003-10-04
  • 打赏
  • 举报
回复
十分感谢 TianGuangZao(天光早),这么给面子,谢谢。不过讨论归讨论,我发现:

'######################
char thankyou(void)
{

printf("\n......\n\n\n");
return 0;
}
'######################

return语句返回的数据类型和而thankyou()的返回类型可以是不一样的(这里前者是int,后者是char)。按你的这种理解,我会觉得很奇怪,“在程序运行时,return 的目的是从被调用函数向调用函数返回值”,这个主函数利用的是“printf("\n......\n\n\n");”这一句,也这就是这个“......”字符串,而非这一句“return 0;”那么return 0;返回的数据应该不是传到主函数的吧?我的理解是告诉程序函数调用完毕,也就是告诉编译器结束函数了。

你说的情况也没错,不过,那是属于return ;语句利用的另一类型。也就是它返回的值被另一函数调用的情况。

还有一点要请教你:RETURN后面如果要接表达式的话,是不是一定要接受一个数值型的?
TianGuangZao 2003-10-04
  • 打赏
  • 举报
回复
编译器给出提示,是由于它在做类型检查时,发现不匹配,给出错误或警告提示。

"return 0;的作用应该是通知编译器", 是这样的理解是完全错误的。
在程序运行时,return 的目的是从被调用函数向调用函数返回值。
不要和编译器扯上任何关系。
msdner 2003-10-04
  • 打赏
  • 举报
回复
TO TianGuangZao(天光早):

这样改我也已经调试过了,可以看看我上面的解答:
'*******************************
大家看以下这个程序,这里的return 0;的作用应该是通知编译器,函数结束的意思吧。我把
thankyou()的返回类型改为void在VC++里好像编译通不过,显示:cannot convert from 'void' to 'char'
'*******************************


TO chongyang() :你讲的很好。不过有一点,我觉得还是有点问题。通过调试,我发现RETURN后面如果要接表达式的话,一定要接受一个数值型的。不信你可以试试。你说不一定的理由是什么呢?
chongyang 2003-10-04
  • 打赏
  • 举报
回复
RETURN 后面不一定要有个什么数值,RETURN 语句也不一定要有!

如果函数的返回类型不是VOID一定要用到return语句。(正确!!!)

因为你声明了函数的返回值,即使调用这个函数的程序语句不使用这个返回值,也要有返回值,否则运行的程序就不知道该如何处理下面的语句了!

RETURN 语句的另一个作用是可以提前结束函数!!
TianGuangZao 2003-10-04
  • 打赏
  • 举报
回复
sorry!
没仔细看。
char thankyou(void)
{

printf("\n......\n\n\n");
return 0;
}
这是个打印函数,不需要给 main 函数返回任何值.
void thankyou(void)
{
printf("\n......\n\n\n");
}
msdner 2003-10-04
  • 打赏
  • 举报
回复
TO TianGuangZao(天光早) :

我不是讲主函数,我说的是用户自定义的函数。可以看看thankyou()里的return 0;语句。
你可以误解了我的意思了。这里的return语句返回的是一个int型数据,而thankyou()的返回类型却是char型的。这里面有一点出入吧?
TianGuangZao 2003-10-04
  • 打赏
  • 举报
回复
好好找本书来看看吧!
既然写成 void main(void)
表示你不需要从 main 函数返回任何值给操作系统。
那么 return 0; 就是完全多余的。
再次说明,和编译器无任何关系。
msdner 2003-10-04
  • 打赏
  • 举报
回复
大家看以下这个程序,这里的return 0;的作用应该是通知编译器,函数结束的意思吧。我把
thankyou()的返回类型改为void在VC++里好像编译通不过,显示:cannot convert from 'void' to 'char' 因此

,我猜测这个return语句的作用就是通知编译器函数已经结束了,它返回的数值对主函数(更准确地讲应该是对调用

这个非主函数的语句)未必有用吧,对吧?


#include <stdio.h>

char thankyou(void);

char Ideas;

void main(void)
{
puts("......");

Ideas=thankyou();
}

char thankyou(void)
{

printf("\n......\n\n\n");
return 0;
}
TianGuangZao 2003-10-04
  • 打赏
  • 举报
回复
可以这样理解,main 函数的调用者是操作系统,所以 return 返回给操作系统,一般 1 表示程序执行成功, 0 表示失败。
和编译器是无任何关系了。简单讲,编译器起的是代码转换工作,即把高级语言代码转换成机器码。
msdner 2003-10-04
  • 打赏
  • 举报
回复
如果return 后面有一个表达式,是不是一定是一个数值型呢?
msdner 2003-10-04
  • 打赏
  • 举报
回复
我怎么感觉,TURE和FALSE是一样的效果呢?
msdner 2003-10-04
  • 打赏
  • 举报
回复
大家好,我是楼主,总感觉哪里不对劲,真是晕,请大家帮忙,谢谢。

TO Kastch(渊) :

但是如果你不是VOID函数
你的输入或者输出都在函数内完成
RETURN语句就相当于告诉函数已经完成返回0”

就是说这个返回的0或者其它数值
是告诉编译器,函数已经完成了,对不对?

return true;(这里的true相当于1)
return false; (这里的true相当于0)
这两 个有什么区别呢?
Wolf0403 2003-10-04
  • 打赏
  • 举报
回复
首先确定几个概念,【以新 C++ 98 规范为规格】
bool 类型包含 true 和 false 两个值类型,占内存空间 1 byte 而 int 占 4 bytes。
在 if 语句中的 int 类型值,0 表示 false 而非○值表示 true。
void 是标准类型,表示“没有东西”。VOID 可能是 MFC/Windef 定义的
#define VOID void
一个函数的声明包含它的返回类型,例如:
void echo(int); // 不返回任何值
int getch (FILE*); // 返回一个 int 值。
当程序执行到 return 语句的时候,会把 return 之后的值返回给调用者。至于是否利用就无所谓了。对于一个 void 函数,可以用 return; 语句表示函数结束。
Kastch 2003-10-04
  • 打赏
  • 举报
回复
你如果是VOID函数的话
你就不用返回当然就不会用RETURN 语句
但是如果你不是VOID函数
你的输入或者输出都在函数内完成
RETURN语句就相当于告诉函数已经完成返回0
加载更多回复(1)

70,011

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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