A. c语言中return的用法疑问
要了解return的真正意义,首先要知道函数调用的原理。我不知道你对PC指针寄存器,状态寄存器和运行时堆栈有多少了解,以下说明基于假设你了解这些术语的基础上。
1. 程序装载如内存,开始执行,CPU的PC指针寄存器指向程序的主入口第一句执行代码。
2. 程序从主入口开始执行,并创建运行时堆栈。
3. CPU将PC指针递增使得程序顺序执行,CPU根据语句执行的结果修改状态寄存器。
4. 当出现函数调用时,将当前的PC指针寄存器的值以及状态寄存器的值压入堆栈,然后将PC指针寄存器的值修改为即将被调用的函数的第一句执行代码。
5. 程序开始执行被调用函数的代码,CPU将PC指针递增使得程序顺序执行,CPU根据语句执行的结果修改状态寄存器。
6. 当遇到return语句或函数自然结束时,CPU将之前压入堆栈的PC指针寄存器和状态寄存器的值弹出,并写回到相应的寄存器中。
7. CPU开始继续执行主函数后续的代码。
下面对以上流程做一下解释
PC指针寄存器中存储的是一个内存地址,该地址中存储着当前正在执行的代码。通过修改这个寄存器的值可以达到跳转到其代码的效果。函数调用和if,switch,for等分支循环语句都是通过操纵PC寄存器来实现的,但函数调用与分支循环的差别在于,函数调用结束后需要返回到上一层函数的执行现场,继续往下运行,这就需要在修改PC指针前将当前的PC指针保存好,一边函数返回时回复,由于子函数又可以继续调用其他函数,所以需要使用堆栈这种后进先出的数据结构去保存。
B. C语言线程如何终止
有三种方式可以终止线程,具体调用函数依赖于使用的线程系统。
1 在线程入口函数中,调用return。 即退出线程入口函数,可以实现终止当前线程效果;
2 在线程执行的任意函数,调用当前线程退出函数,可以退出当前线程;
3 在任意位置,调用线程终止函数,并传入要终止线程的标识符,即pid,可以实现终止对应线程效果。
C. C语言如何终止线程
面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细。
D. C语言中return用法(请熟练者进)
return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么
比方主函数intmain()
{}这里就必须有一个return,只有void时可以不用返回值。
功能函数
intfun()
{
return1;
}
这个时候fun函数的作用就是返回一个int类型的值,可以直接拿来用比方inta=fun();
这里就相当于inta=1;
另外一个作用return后面的语句不会执行,我们可以用它来结束程序。
(4)C语言return清理线程扩展阅读:
注意事项:
1、一个c程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大的程序,一般不希望把所有内容全放在一个文件中,而是将它们分别放在若干个源文件中,由若干个源程序文件组成一个c程序。这样便于分别编写和编译,调高调试效率。一个源程序文件可以为多个c程序公用。
2、一个源程序文件由一个或多个函数以及其他有关内容(如指令,数据声明与定义等)组成。一个源程序文件是一个编译单位,子啊程序编译时是以源程序文件为单位进行编译的,而不是以函数为单位进行编译的。
3、c程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回main函数,在main函数中结束整个程序的进行。
E. 关于C语言中return的用法
一般来说,return函数的作用大多数表现在判断一个函数是否成功完成,比如说你写了一个很大的函数,当你在其他的程序中使用到这个函数的时候,一般的方法都要在使用它之后判断一下函数是否执行成功,那么如何判断一个函数是否成功执行了呢?这就要求函数结尾return一个值,当调用这个函数之后得到的值是return的值,说明这个函数执行成功了,当然函数不一定必须在结尾返回,如果你想知道错误发生在函数的哪个位置,你也可以在各个部位定义其他的返回值用来描述这个错误
而return用来作为值的传递实在是一种为了方便的目的,由于return只能一次返回一个值,所以当你有多个参数要返回的时候,就需要用参数传递来解决,要不函数有参数合用,是吧
F. c语言中return()起什么作用
关于C语言中return的一些总结
return是C++预定义的语句,它提供了种植函数执行的一种放大。当return语句提供了一个值时,这个值就成为函数的返回值.
说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助.
很多人甚至市面上的一些书籍,都使用了voidmain(),其实这是错误的。C/C++中从来没有定义过voidmain()。C++之父BjarneStroustrup在他的主页上的FAQ中明确地写着Thedefinitionvoidmain(){/*...*/}isnotandneverhasbeenC++,norhasitevenbeenC.(voidmain()从来就不存在于C++或者C)。下面我分别说一下C和C++标准中对main函数的定义。
1.C
在C89中,main()是可以接受的。BrianW.Kernighan和DennisM.Ritchie的经典巨着TheCprogrammingLanguage2e(《C程序设计语言第二版》)用的就是main()。不过在最新的C99标准中,只有以下两种定义方式是正确的:
intmain(void)
intmain(intargc,char*argv[])
(参考资料:ISO/IEC9899:1999(E)Programminglanguages—C5.1.2.2.1Programstartup)
当然,我们也可以做一点小小的改动。例如:char*argv[]可以写成char**argv;argv和argc可以改成别的变量名(如intval和charval),不过一定要符合变量的命名规则。
如果不需要从命令行中获取参数,请用intmain(void);否则请用intmain(intargc,char*argv[])。
main函数的返回值类型必须是int,这样返回值才能传递给程序的激活者(如操作系统)。
如果main函数的最后没有写return语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return0;,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return0;,大概是因为vc6是98年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上return语句了吧!不过,gcc3.2(Linux下的C编译器)会在生成的目标文件中加入return0;。
2.C++
C++98中定义了如下两种main函数的定义方式:
intmain()
intmain(intargc,char*argv[])
(参考资料:ISO/IEC14882(1998-9-01)Programminglanguages—C++3.6Startandtermination)
intmain()等同于C99中的intmain(void);intmain(intargc,char*argv[])的用法也和C99中定义的一样。同样,main函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98规定编译器要自动在生成的目标文件中加入return0;。同样,vc6也不支持这个特性,但是g++3.2(Linux下的C++编译器)支持。
3.关于voidmain
在C和C++中,不接收任何参数也不返回任何信息的函数原型为“voidfoo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成voidmain(void)。然而这是错误的!main函数的返回值应该定义为int类型,C和C++标准中都是这样规定的。虽然在一些编译器中,voidmain可以通过编译(如vc6),但并非所有编译器都支持voidmain,因为标准中从来没有定义过voidmain。g++3.2中如果main函数的返回值不是int类型,就根本通不过编译。而gcc3.2则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用intmain。
4.返回值的作用
main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出,否则代表程序异常退出。下面我们在winxp环境下做一个小实验。首先编译下面的程序:
intmain(void)
{
return0;
}
然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo%ERRORLEVEL%”,回车,就可以看到程序的返回值为0。假设刚才编译好的文件是a.exe,如果输入“a&&dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return-1”,或者别的非0值,重新编译后输入“a&&dir”,则dir不会执行。因为&&的含义是:如果&&前面的程序正常退出,则继续执行&&后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是intmain的好处。如果你有兴趣,也可以把main函数的返回值类型改成非int类型(如float),重新编译后执行“a&&dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入a||dir的话,则表示如果a异常退出,则执行dir。
5.那么intmain(intargc,char*argv[],char*envp[])呢?
这当然也不是标准C里面定义的东西!char*envp[]是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。
到了这里,你应该了解为什么主函数定义为int返回类型,而且函数体里面有return0;这个语句了吧.
下面具体说说我对return的应用的理解。
只要一个函数的返回值是数字型的,那么就可以返回0(即return0),其实你返回多少都没问题。一般情况下,C++做出来的函数都要求返回一个值,当函数执行正常,且达到了一般情况下的目的,那么就返回0表示正确的调用了该函数,这个0就是返回给主调函数以通知没有出错的;如果函数调用中出错,或者没有按照一般情况执行,那么就返回1,以告知主调函数采取响应策略;如果你在某个函数所在类的定义所在的头文件中定义了一组状态值(一般都是负整数),那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误,这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void,至少返回应该是int,而在函数的最后加上return0.语句:
intfunc(参数列表)
{
……
……
……
Return0;
}
在函数中,如果碰到return语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。
如果你定义一个函数有返回类型,可以想下面那样调用:
intfunc()
{
intvalue;
……
……
……
returnvalue;
}
intmain()
{
intintvalue;
intvalue=func();
……
……
teturn0;
}
return语句后面具体是什么内容,这就要具体情况具体分析了:
(1)在返回类型是char的函数中,return后应该是char类型的值;
(2)在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;其他的按照你的目的而定,只要是int类型就行了
(3)在返回类型是结构类型的函数中,return后应该是结构的一个实例对象。
总之,函数定义为什么样的返回类型,该函数中return后就应该是相应类型的值。
G. C语言如何终止线程
有三种方式可以终止线程,具体调用函数依赖于使用的线程系统。
1 在线程入口函数中,调用return。 即退出线程入口函数,可以实现终止当前线程效果;
2 在线程执行的任意函数,调用当前线程退出函数,可以退出当前线程;
3 在任意位置,调用线程终止函数,并传入要终止线程的标识符,即pid,可以实现终止对应线程效果。
H. C语言如何终止线程
调用ExitThread函数。
该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类对象)将不被撤消。
(3) 调用TerminateThread函数。
TerminateThread 能撤消任何线程。线程的内核对象的使用计数也被递减。TerminateThread函数是异步运行的函数。如果要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数。当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用TerminateThread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。
I. c语言如何释放一个被阻塞住的线程
可以用线程同步机制进行,比如使用CEvent等
可以保留创建的线程指针,使用:
BOOL TerminateThread( HANDLEhThread,DWORDdwExitCode);
J. C语言中return的作用是什么,能具体点吗
return 表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。
return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。
(10)C语言return清理线程扩展阅读:
C语言return返回值的说明:
1、没有返回值的函数为空类型,用void表示。
2、return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值。
3、函数一旦遇到 return 语句就立即返回,后面的所有语句都不会被执行到了。从这个角度看,return 语句还有强制结束函数执行的作用。
4、return语句是提前结束函数的唯一办法。
参考资料来源:网络-return(C语言语句)