ImageVerifierCode 换一换
格式:DOCX , 页数:78 ,大小:75.73KB ,
资源ID:10600101      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10600101.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(关于C语言的voidmainDOC.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

关于C语言的voidmainDOC.docx

1、关于C语言的voidmainDOC关于C语言的void main()作者:admin 发布时间:2012-02-13 17:41 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣15很多人甚至市面上的一些书籍,都使用了void main( ),其实这是错误的。C/C+中从来没有定义过void main( )。C+之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main( ) /* . */ is not and never has been C+, nor has it even been C.( void m

2、ain( )从来就不存在于C+或者C)。下面我分别说一下C和C+标准中对main函数的定义。一、 C语言中的main()在C89中,main( )是可以接受的。Brian W. Kernighan和Dennis M. Ritchie的经典巨著The C programming Language 2e(C 程序设计语言第二版)用的就是main( )。不过在最新的C99标准中,只有以下两种定义方式是正确的:int main(void)int main(int argc, char *argv)(参考资料:ISO/IEC 9899:1999 (E) Programming languages ? C

3、 5.1.2.2.1 Program startup)当然,我们也可以做一点小小的改动。例如:char *argv可以写成char *argv;argv和argc可以改成别的变量名(如intval和charval),不过一定要符合变量的命名规则。如果不需要从命令行中获取参数,请用int main(void);否则请用int main(int argc, char *argv)。main函数的返回值类型必须是int,这样返回值才能传递给程序的调用者(如操作系统)。如果main函数的最后没有写return语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return 0;,表示

4、程序正常退出。不过,我还是建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0;,大概是因为vc6是98年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上return语句了吧!不过,gcc3.2(Linux下的C编译器)会在生成的目标文件中加入return 0;。二、 C+中的main()C+98中定义了如下两种main函数的定义方式:int main( )int main(int argc, char *argv)参考资料:ISO/IEC 14882(1998-9-01)Programming

5、languages ? C+ 3.6 Start and terminationint main( )等同于C99中的int main(void);int main(int argc, char *argv)的用法也和C99中定义的一样。同样,main函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C+98规定编译器要自动在生成的目标文件中加入return 0;。同样,vc6也不支持这个特性,但是g+3.2(Linux下的C+编译器)支持。三、 关于void main()在C和C+中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能

6、正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void)。然而这是错误的!main函数的返回值应该定义为int类型,C和C+标准中都是这样规定的。虽然在一些编译器中,void main可以通过编译(如vc6),但并非所有编译器都支持void main,因为标准中从来没有定义过void main。g+3.2中如果main函数的返回值不是int类型,就根本通不过编译。而gcc3.2则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用int main。不要用“我的老师告诉我这么做是对的”之类的话来为自己开脱;老师们总是习惯犯错误(te

7、achers have a bad habit of being wrong)。写安全的,合乎标准的代码,大家就可以专注于你程序中其它的问题而不是在这种规范方面的东西上浪费时间。应当指出:在某些系统中,若程序使用void main定义或没有return值,则可能导致堆栈异常从而导致系统故障。(详见后面英文部分)四、返回值的作用main函数的返回值用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其它数字的含义则由系统决定。通常,返回非零代表程序异常退出。下面我们在winxp环境下做一个小实验。首先编译下面的程序:int main(void)return 0;然后打开附件里的“命令提示

8、符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为0。假设刚才编译好的文件是a.exe,如果输入“a & dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非0值,重新编译后输入“a & dir”,则dir不会执行。因为&的含义是:如果&前面的程序正常退出,则继续执行&后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是int main的好处。如果你有兴趣,也可以把main函数的返回值类型改成非int类型(如float),重新编译后执行“a &

9、dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入a | dir的话,则表示如果a异常退出,则执行dir。五、那么int main(int argc, char *argv, char *envp)呢?这当然也不是标准C/C+里面定义的东西!char *envp是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用除非你的程序是专门设计用于工作在特定的环境中而且需要获取系统的环境变量。在C语言有一定基础之后,怎么样能够更快的成长?作者:admin 发布时间:2012-02-13 18:49 来源:C语言中

10、文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣0这个问题比较常见,通常在程序语言有了一定基础之后,成长最快的方法就是多编程序,没有其他任何捷径,在实践中碰到问题/排查问题,提高程序的实现能力和调试能力,在实践中自然而然将各种知识融会贯通,在实现程序的过程中注意体会每个问题的解决方法以及每个Bug的排除方法,实践能力提高了,程序设计的技巧和能力也就提高了.祝大家的程序越写越好!写好C程序的10条秘籍作者:admin 发布时间:2012-02-15 18:22 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣16神乎其技,惟C程序,功到自成,十大建议!1. 汝应频繁

11、催动lint工具,据其语法声明修习内力,此事皆因lint之思虑决断实远在君上。2. 不可依随NULL指针,如若不然,混沌痴颠必俟君于彼岸。3. 纵有天赋大智慧,知晓其事无碍,汝亦当尽数强制挪移函数参数为原型所期之数据类型,以免一时疏忽,致使数据类型向汝讨还血债。4. 若头文件未于函数原型之中声明返回值类型,汝当亲为此事,更须谨慎再三,以防不测降临汝身。5. 汝须亲核字符串、数组操作之越界与否。古之圣人有言: 尝祈门人对答“然也”,不意门人答曰“吾了然于胸无须多虑尽请宽心他日趋庭必当重谢”所期者短,所获者长,此于数组,实最险要处也。6. 若函数声明内提及,于异常时将返回错误代码云云,汝当谨慎校核

12、该返回值。或有校核语句使汝之代码增大数倍,令汝之手指因敲键而痛楚莫名之事,汝亦当如此。不然,汝固以为此异常之事难得一见,上苍亦必借此惩戒汝之傲慢。7. 汝应研习库函数,不当亲笔重写之。如是,汝之代码必短小易读,汝之心境必清爽恬淡。8. 纵汝不愿,汝亦应借括号、缩进之属,使汝之代码间架清晰,可为后者借鉴。汝之大智慧施于决疑解难则可,施于敷设谜团、淆乱文体则万万不可。9. 外部标识符之前六字符当与众不同。此律法看似粗陋,和者寥寥,然其效用自能延续永远。汝若不从此言,他日,汝欲连接程序于旧作之上时,必抓耳挠腮、蓬头垢面,狼狈之相尽现矣。10. 或有族类,大言炎炎,云“普天之下,莫非VAX”。于此等异

13、端,汝当摒弃之、断绝之、远避之。更有异人,笃信魔道,以为纵汝所用电脑频繁换代,汝之程序亦能长久适用。汝亦不可与此类恶人来往,谨记谨记C语言中史上最愚蠢的Bug作者:admin 发布时间:2012-02-15 18:59 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣8本文来自“The most stupid C bug ever”,很有意思,分享给大家。我相信这样的bug,就算你是高手你也会犯的。你来看看作者犯的这个Bug吧。首先,作者想用一段程序来创建一个文件,如果有文件名的话,就创建真正的文件,如果没有的话,就调用?tmpfile()?创建临时文件。他这段程序就是H

14、TTP下载的C程序。code=200就是HTTP的返回码。else if (code = 200) / Downloading whole file/* Write new file (plus allow reading once we finish) */g = fname ? fopen(fname, w+) : tmpfile(); 但是这个程序,只能在Unix/Linux下工作,因为 Microsoft 的?tmpfile()的实现?居然选择了 C: 作为临时文件的存放目录,这对于那些没有管理员权限的人来说就出大问题了,在Windows 7下,就算你有管理员权限也会有问题。所以,上面

15、的程序在Windows平台下需要用不同的方式来处理,不能直接使用Windows的tmpfile()函数。于是作者就先把这个问题记下来,在注释中写下了FIXME:else if (code = 200) / Downloading whole file/* Write new file (plus allow reading once we finish) */ FIXME Win32 native version fails here because/ Microsofts version of tmpfile() creates the file in C:g = fname ? fopen

16、(fname, w+) : tmpfile(); 然后,作者觉得需要写一个跨平台的编译:FILE * tmpfile ( void ) #ifndef _WIN32return tmpfile();#else/code for Windows;#endif然后,作者觉得这样实现很不好,会发现名字冲突,因为这样一来这个函数太难看了。于是他重构了一下他的代码写一个自己实现的tmpfile() w32_tmpfile,然后,在Windows 下用宏定义来重命名这个函数为tmpfile()。(注:这种用法是比较标准的跨平台代码的写法)#ifdef _WIN32 #define tmpfile w32_

17、tmpfile#endif FILE * w32_tmpfile ( void ) /code for Windows;搞定!编译程序,运行。靠!居然没有调用到我的w32_tmpfile(),什么问题?调试,单步跟踪,果然没有调用到!难道是问号表达式有问题?改成if else 语句,好了!if(NULL != fname) g = fopen(fname, w+); else g = tmpfile();问号表达式不应该有问题吧,难道我们的宏对问号表达式不起作用,这难道是编译器的预编译的一个bug?作者怀疑到。现在我们把所有的代码连在一起看,并比较一下:能工作的C语言代码#ifdef _WIN

18、32# define tmpfile w32_tmpfile#endif FILE * w32_tmpfile ( void ) code for Windows; else if (code = 200) / Downloading whole file/* Write new file (plus allow reading once we finish) */ FIXME Win32 native version fails here because/ Microsofts version of tmpfile() creates the file in C:/g = fname ? f

19、open(fname, w+) : tmpfile();if(NULL != fname) g = fopen(fname, w+); else g = tmpfile();不能工作的C语言代码#ifdef _WIN32# define tmpfile w32_tmpfile#endif FILE * w32_tmpfile ( void ) code for Windows; else if (code = 200) / Downloading whole file/* Write new file (plus allow reading once we finish) */ FIXME W

20、in32 native version fails here because/ Microsofts version of tmpfile() creates the file in C:g = fname ? fopen(fname, w+) : tmpfile();也许你在一开始就看到了这个bug,但是作者没有。所有的问题都出在注释上:/* Write new file (plus allow reading once we finish) */ FIXME Win32 native version fails here because/ Microsofts version of tmp

21、file() creates the file in C:你看到了最后那个C:吗?在C中,“” 代表此行没有结束,于是,后面的代码也成了注释。这就是这个bug的真正原因!而之所以改成if-else能工作的原因是因为作者注释了老的问号表达式的代码,所以,那段能工作的代码成了:/* Write new file (plus allow reading once we finish) */ FIXME Win32 native version fails here because Microsofts version of tmpfile() creates the file in C: /g =

22、fname ? fopen(fname, w+) : tmpfile();if(NULL != fname) g = fopen(fname, w+); else g = tmpfile();我相信,当作者找到这个问题的原因后,一定会骂一句“妈的”!我也相信,这个bug花费了作者很多时间!最后,我也share一个我以前犯的一个错。我有一个小函数,需要传入一个int* pInt的类型,然后我需要在我的代码里 把这个int* pInt作除数。于是我的代码成了下面的这个样子:float result = num/*pInt;./* some comments */-x10 ? f(result):f

23、(-result);因为我在我当时用vi编写代码,所以没有语法高亮,而我的程序都编译通过了,但是却出现了很奇怪的事。我也不知道,用gdb调式的时候,发现有些语句直接就过了。这个问题让我花了很多时间,最后发现问题原来是没有空格导致的,TNND,下面我用代码高亮的插件来显示上面的代码,float result = num/*pInt; . /* some comments */ -x10 ? f(result):f(-result);Holly Shit! 我的代码成了:float result = num-x10 ? f(result):f(-result);妈的!我的这个错误在愚蠢程度上和上面

24、那个作者出的错误有一拼对于C语言,该如何选择进程与线程作者:admin 发布时间:2012-02-17 21:33 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣1进程vs线程,如何选择?我们编写程序,到底是采用多线程还是多进程?这里是有区别的,采用不同的机制能够获得的效率也不一样。如何选择适合我们自己的程序的机制呢?下面是一些常见的选择的看法,不过也只是提供给大家参考参考,具体设计的时候还是要自己处理。一个程序里面的所有的线程都在同一个运行空间中执行。而一个程序的子进程则是运行在另外的执行空间中的,这里是通过调用了exec函数来实现的。同一个进程中的某个线程的故障可以

25、影响其它的线程,因为所有的线程共享同一个虚拟内存空间以及其他资源。例如,某个线程对没有初始化的指针进行写操作,就可能影响其它的线程。而一个出了问题的进程是不会影响其它的进程的,因为它们分别在不同的进程空间进行自己的操作。创建新的进程需要进行内存的拷贝操作,这就额外的增加了系统负担,而线程则不需要这个拷贝过程。不过由于现在的操作系统的实现是仅仅当内存需要改变的时候才拷贝改动的部分,所以这里的影响相对还是比较小的。线程通常用在某些需要比较好的同步操作的场合。例如,某个问题可以分解为多个几乎对等同步处理的任务的话,则是用线程是很好的选择。进程则适合应用在不需要严格的同步的场合。线程之间共享数据是很方

26、便的,因为不同的线程本来就是共享同样的存储空间。(然而这里就要非常仔细的处理竞争的情况。)而不同进程之间共享数据则需要使用一些ipc机制,例如管道、共享内存、套接字等等三款C语言编程软件对比【优缺点】作者:admin 发布时间:2012-02-19 22:20 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣0常用的C语言编程软件有Visual Stdio 6.0、Tubor C和Win-TC等等,笔者下面就三款软件的优点和缺点做一下简单地对比。1. Visual Stdio 6.0:一般简称VC(版本是6.0),这款软件是使用最多的一款C语言编程软件,有简装版、绿色版、

27、企业版等各个不同的版本,可以满足不同人的需求。注:企业版的安装有点困难。2. Tubor C:小巧快速,但是界面是DOS风格的,不好看,并且不习惯!3. Win-TC:体积比较小,界面也漂亮,但是有一些用户反应再编程的过程中无法输入汉字。C语言的应用范围和发展前途简介作者:admin 发布时间:2012-02-19 22:38 来源:C语言中文网 人围观 分享到:QQ空间新浪微博人人网腾讯微博豆瓣6C一般用来底层开发,如操作系统,嵌入式开发,或者要求效率,高可移植性的地方。C对人要求很高,程序员要考虑的地方太多。他的特点就是每一个字节都可以精确控制,不象C+,编译器为你自动加的东西太多,效率也

28、就低了。windows 就是用它来开发的,linux很多程序也用它来写。例如:用C语言编写简单的接口程序.在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言的方便。在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)

29、的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)进行如下简单的编码:0H:发送的是新的半个字节数据1H:重新发送上次传送错误的数据2H:文件名结束3H:文件结束这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通过信息位来区分。下面就是我用C语言编写控制串行口的程序。我们以一个发送文件的程序为例,介绍一下用C语言实现对接口的控制。用C语言编写简单的接口程序源代码:#include dos.h /*c的特点在于只要

30、有头文件,就能和任意文件接上*/#include stdlib.h#include stdio.h#define PORT 0void SendFile(char fname); /* 发送文件*/void Send(int s); /*发送一个字节*/void SendFileName(char fname); /*发送文件名*/void ReceiveFile(); /*接收文件*/void GetFileName(char f); /*接收文件名*/void InitPort(int port,unsigned char para); /*初始化端口*/void SendPort(int port,char c); /*端口发送*/int ReadPort(int port); /*读端口字节*/int CheckState(int port); /*检查端口状态*/int Receive(int port,int G); /*接收一个字节*/main(argc,argv)int argc;char *argv;if(argc2)printf(Please input R(receive) or S(sent) param

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1