﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-悲惨的狼的门户-文章分类-C语言第五章</title><link>http://www.cnitblog.com/zhangjiang838/category/5270.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 05:53:13 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 05:53:13 GMT</pubDate><ttl>60</ttl><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26506.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:18:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26506.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26506.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26506.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26506.html</trackback:ping><description><![CDATA[<p align=left><font color=#cc0000><strong>概述</strong></font><br><br>　　在第一章中已经介绍过，Ｃ源程序是由<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>组成的。 虽然在前面各章的程序中都只有一个主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>main()， 但实用程序往往由多个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>组成。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是Ｃ源程序的基本模块， 通过对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>模块的调用实现特定的功能。Ｃ语言中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>相当于其它高级语言的子程序。 Ｃ语言不仅提供了极为丰富的库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>(如Turbo C，MS C 都提供了三百多个库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>)，还允许用户建立自己定义的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。用户可把自己的算法编成一个个相对独立的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>模块，然后用调用的方法来使用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。<br><br>　　可以说Ｃ程序的全部工作都是由各式各样的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>完成的， 所以也把Ｃ语言称为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>式语言。 由于采用了<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>模块式的结构， Ｃ语言易于实现结构化程序设计。使程序的层次结构清晰，便于程序的编写、阅读、调试。<br><br>　　在Ｃ语言中可从不同的角度对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>分类。<br><br>1. 从<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义的角度看，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>可分为库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和用户定义<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>两种。<br><br>(1)库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　由Ｃ系统提供，用户无须定义， 也不必在程序中作类型说明，只需在程序前包含有该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>均属此类。<br><br>(2)用户定义<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　由用户按需要写的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。对于用户自定义<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>， 不仅要在程序中定义<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>本身， 而且在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>模块中还必须对该被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>进行类型说明，然后才能使用。<br><br>2. Ｃ语言的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>兼有其它语言中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和过程两种功能，从这个角度看，又可把<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>分为有返回值<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和无返回值<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>两种。<br><br>(1)有返回值<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　此类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>被调用执行完后将向调用者返回一个执行结果， 称为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值。如数学<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>即属于此类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。 由用户定义的这种要返回<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，必须在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明中明确返回值的类型。<br><br>(2)无返回值<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　此类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>用于完成某项特定的处理任务， 执行完成后不向调用者返回<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值。这类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>类似于其它语言的过程。 由于<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>无须返回值，用户在定义此类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>时可指定它的返回为&#8220;空类型&#8221;， 空类型的说明符为&#8220;void&#8221;。<br><br>3. 从主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之间数据传送的角度看又可分为无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和有参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>两种。<br><br>(1)无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义、<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明及<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用中均不带参数。 主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之间不进行参数传送。 此类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>通常用来完成一组指定的功能，可以返回或不返回<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值。<br><br>(2)有参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　也称为带参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义及<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明时都有参数， 称为形式参数(简称为形参)。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时也必须给出参数， 称为实际参数(简称为实参)。 进行<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时，主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>将把实参的值传送给形参，供被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>使用。<br><br>4. Ｃ语言提供了极为丰富的库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>， 这些库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>又可从功能角度作以下分类。<br>(1)字符类型分类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于对字符按ASCII码分类：字母，数字，控制字符，分隔符，大小写字母等。<br>(2)转换<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于字符或字符串的转换；在字符量和各类数字量 (整型， 实型等)之间进行转换；在大、小写之间进行转换。<br>(3)目录路径<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于文件目录和路径操作。<br>(4)诊断<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于内部错误检测。<br>(5)图形<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于屏幕管理和各种图形功能。 <br>(6)输入输出<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于完成输入输出功能。<br>(7)<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BD%D3%BF%DA">接口</a><a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于与DOS，BIOS和硬件的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BD%D3%BF%DA">接口</a>。<br>(8)字符串<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a> <br>　　用于字符串操作和处理。<br>(9)内存管理<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于内存管理。<br>(10)数学<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于数学<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>计算。<br>(11)日期和时间<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于日期，时间转换操作。<br>(12)进程控制<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于进程管理和控制。<br>(13)其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　用于其它各种功能。<br>　　<br>　　以上各类<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>不仅数量多，而且有的还需要硬件知识才会使用，因此要想全部掌握则需要一个较长的学习过程。 应首先掌握一些最基本、 最常用的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，再逐步深入。由于篇幅关系，本书只介绍了很少一部分库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>， 其余部分读者可根据需要查阅有关手册。<br><br>　　还应该指出的是，在Ｃ语言中，所有的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义，包括主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>main在内，都是平行的。也就是说，在一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体内， 不能再定义另一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>， 即不能嵌套定义。但是<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之间允许相互调用，也允许嵌套调用。习惯上把调用者称为主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>还可以自己调用自己，称为递归调用。main <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，它可以调用其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，而不允许被其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用。 因此，Ｃ程序的执行总是从main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>开始， 完成对其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的调用后再返回到main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，最后由main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>结束整个程序。一个Ｃ源程序必须有，也只能有一个主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>main。</p>
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:18 <a href="http://www.cnitblog.com/zhangjiang838/articles/26506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26504.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:17:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26504.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26504.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26504.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26504.html</trackback:ping><description><![CDATA[<font color=#ff0000>二、</font><a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><font color=#ff0000>的值<br><br></font>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值是指<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>被调用之后， 执行<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体中的程序段所取得的并返回给主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值。如调用正弦<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>取得正弦值，调用例5.1的max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>取得的最大数等。对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值(或称<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值)有以下一些说明：<br><br>1. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值只能通过return语句返回主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。return 语句的一般形式为： <br>return 表达式； <br>或者为：<br>return (表达式)；<br>该语句的功能是计算表达式的值，并返回给主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。 在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中允许有多个return语句，但每次调用只能有一个return 语句被执行， 因此只能返回一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值。<br><br>2. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值的类型和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义中<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的类型应保持一致。 如果两者不一致，则以<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>类型为准，自动进行类型转换。<br><br>3. 如<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值为整型，在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义时可以省去类型说明。<br><br>4. 不返回<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，可以明确定义为&#8220;空类型&#8221;， 类型说明符为&#8220;void&#8221;。如例5.3中<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>s并不向主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值，因此可定义为：<br><font color=#009900>void s(int n)<br>{ &#8230;&#8230;<br>}<br></font><br>　　一旦<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>被定义为空类型后， 就不能在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中使用被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值了。例如，在定义s为空类型后，在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中写下述语句 sum=s(n); 就是错误的。为了使程序有良好的可读性并减少出错， 凡不要求返回值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>都应定义为空类型。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中调用某<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之前应对该被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>进行说明， 这与使用变量之前要先进行变量说明是一样的。 在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>作说明的目的是使编译系统知道被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值的类型， 以便在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中按此种类型对返回值作相应的处理。 对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的说明也有两种格式，一种为传统格式，其一般格式为： 类型说明符 被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名()； 这种格式只给出<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值的类型，被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名及一个空括号。<br><br>　　这种格式由于在括号中没有任何参数信息， 因此不便于编译系统进行错误检查，易于发生错误。另一种为现代格式，其一般形式为： <br>类型说明符 被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名(类型 形参，类型 形参&#8230;)； <br>或为：<br>类型说明符 被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名(类型，类型&#8230;)； <br>　　现代格式的括号内给出了形参的类型和形参名， 或只给出形参类型。这便于编译系统进行检错，以防止可能出现的错误。例5.1 main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中对max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的说明若<br>用传统格式可写为：<br>int max();<br>用现代格式可写为：<br>int max(int a,int b);<br>或写为:<br>int max(int,int)；<br>　　Ｃ语言中又规定在以下几种情况时可以省去主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明。<br>1. 如果被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的返回值是整型或字符型时， 可以不对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>作说明，而直接调用。这时系统将自动对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值按整型处理。例5.3的主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中未对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>s作说明而直接调用即属此种情形。<br><br>2. 当被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义出现在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之前时， 在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中也可以不对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>再作说明而直接调用。例如例5.1中， <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>max的定义放在main <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之前，因此可在main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中省去对 max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明int max(int a,int b)。<br><br>3. 如在所有<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义之前， 在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>外预先说明了各个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的类型，则在以后的各主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中，可不再对被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>作说明。例如：<br><font color=#009900>char str(int a);<br>float f(float b);<br>main()<br>{<br>&#8230;&#8230;<br>}<br>char str(int a)<br>{<br>&#8230;&#8230;<br>}<br>float f(float b)<br>{<br>&#8230;&#8230;<br>}<br></font>其中第一，二行对str<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和f<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>预先作了说明。 因此在以后各<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中无须对str和f<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>再作说明就可直接调用。<br><br>4. 对库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的调用不需要再作说明， 但必须把该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的头文件用include命令包含在源文件前部。数组作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数数组可以作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的参数使用，进行数据传送。 数组用作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数有两种形式，一种是把数组元素(下标变量)作为实参使用； 另一种是把数组名作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参和实参使用。一、数组元素作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>实参数组元素就是下标变量，它与普通变量并无区别。 因此它作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>实参使用与普通变量是完全相同的，在发生<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时， 把作为实参的数组元素的值传送给形参，实现单向的值传送。例5.4说明了这种情况。[例5.4]判别一个整数数组中各元素的值，若大于0 则输出该值，若小于等于0则输出0值。编程如下：<br><font color=#009900>void nzp(int v)<br>{<br>if(v&gt;0)<br>printf("%d ",v);<br>else<br>printf("%d ",0);<br>}<br>main()<br>{<br>int a[5],i;<br>printf("input 5 numbers\n");<br>for(i=0;i&lt;5;i++)<br>{<br>scanf("%d",&amp;a[i]);<br>nzp(a[i]);<br>}<br>}void nzp(int v)<br>{ &#8230;&#8230;<br>}<br>main()<br>{<br>int a[5],i;<br>printf("input 5 numbers\n");<br>for(i=0;i&lt;5;i++)<br>{ scanf("%d",&amp;a[i]);<br>nzp(a[i]);<br>}<br>}</font> <br>　　本程序中首先定义一个无返回值<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>nzp，并说明其形参v 为整型变量。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体中根据v值输出相应的结果。在main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中用一个for 语句输入数组各元素， 每输入一个就以该元素作实参调用一次nzp<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，即把a[i]的值传送给形参v，供nzp<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>使用。<br>
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:17 <a href="http://www.cnitblog.com/zhangjiang838/articles/26504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26505.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:17:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26505.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26505.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26505.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26505.html</trackback:ping><description><![CDATA[<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><font color=#ff0000>定义的一般形式<br><br></font>1.无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的一般形式 <br>类型说明符 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名() <br>{ <br>类型说明 <br>语句 <br>}<br>　　其中类型说明符和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名称为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>头。 类型说明符指明了本<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的类型，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的类型实际上是<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值的类型。 该类型说明符与第二章介绍的各种说明符相同。 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名是由用户定义的标识符，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名后有一个空括号，其中无参数，但括号不可少。{} 中的内容称为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体中也有类型说明， 这是对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体内部所用到的变量的类型说明。在很多情况下都不要求无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>有返回值， 此时<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>类型符可以写为void。<br>我们可以改为一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义： <br><font color=#009900>void Hello()<br>{<br>printf ("Hello,world \n");<br>}<br></font>　这里，只把main改为Hello作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名，其余不变。Hello <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是一个无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，当被其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时，输出Hello world字符串。<br><br>2.有参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的一般形式 <br>类型说明符 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名(形式参数表) <br>型式参数类型说明 <br>{ <br>类型说明 <br>语句 <br>}<br>　　有参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>比无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>多了两个内容，其一是形式参数表， 其二是形式参数类型说明。在形参表中给出的参数称为形式参数， 它们可以是各种类型的变量， 各参数之间用逗号间隔。在进行<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时，主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>将赋予这些形式参数实际的值。 形参既然是变量，当然必须给以类型说明。例如，定义一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>， 用于求两个数中的大数，可写为：<br><font color=#009900>int max(a,b)<br>int a,b;<br>{<br>if (a&gt;b) return a;<br>else return b;<br>} <br></font>　　第一行说明max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是一个整型<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，其返回的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值是一个整数。形参为a,b。第二行说明a,b均为整型量。 a,b 的具体值是由主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>在调用时传送过来的。在{}中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体内， 除形参外没有使用其它变量，因此只有语句而没有变量类型说明。 上边这种定义方法称为&#8220;传统格式&#8221;。 这种格式不易于编译系统检查，从而会引起一些非常细微而且难于跟踪的错误。ANSI C 的新标准中把对形参的类型说明合并到形参表中，称为&#8220;现代格式&#8221;。<br>　　例如max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>用现代格式可定义为：<br><font color=#009900>int max(int a,int b)<br>{<br>if(a&gt;b) return a;<br>else return b;<br>} <br></font>　　现代格式在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明(后面将要介绍)时， 给出了形式参数及其类型，在编译时易于对它们进行查错， 从而保证了<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明和定义的一致性。例1.3即采用了这种现代格式。 在max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体中的return语句是把a(或b)的值作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值返回给主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。有返回值<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中至少应有一个return语句。 在Ｃ程序中，一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的定义可以放在任意位置， 既可放在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>main之前，也可放在main之后。例如例1.3中定义了一个max <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，其位置在main之后， 也可以把它放在main之前。<br>修改后的程序如下所示。<br><font color=#009900>int max(int a,int b)<br>{<br>if(a&gt;b)return a;<br>else return b;<br>}<br>void main()<br>{<br>int max(int a,int b);<br>int x,y,z;<br>printf("input two numbers:\n");<br>scanf("%d%d",&amp;x,&amp;y);<br>z=max(x,y);<br>printf("maxmum=%d",z);<br>}</font><br>　　现在我们可以从<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义、 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明及<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的角度来分析整个程序，从中进一步了解<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的各种特点。程序的第1行至第5行为max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义。进入主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后，因为准备调用max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，故先对max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>进行说明(程序第8行)。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明并不是一回事，在后面还要专门讨论。 可以看出<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明与<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>头部分相同，但是末尾要加分号。程序第12 行为调用max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，并把x,y中的值传送给max的形参a,b。max<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>执行的<br>结果 (a或b)将返回给变量z。最后由主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>输出z的值。<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的一般形式前面已经说过，在程序中是通过对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的调用来执行<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体的，其过程与其它语言的子程序调用相似。Ｃ语言中， <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的一般形式为： <br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名(实际参数表) 对无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时则无实际参数表。 实际参数表中的参数可以是常数，变量或其它构造类型数据及表达式。 各实参之间用逗号分隔。'Next of Page在Ｃ语言中，可以用以下几种方式调用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：<br>1.<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>表达式<br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>作表达式中的一项出现在表达式中，以<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值参与表达式的运算。这种方式要求<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是有返回值的。例如： z=max(x,y)是一个赋值表达式，把max的返回值赋予变量z。'Next of Page<br>2.<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>语句<br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的一般形式加上分号即构成<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>语句。例如： printf ("%D",a);scanf ("%d",&amp;b);都是以<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>语句的方式调用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。<br>3.<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>实参<br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>作为另一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的实际参数出现。 这种情况是把该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的返回值作为实参进行传送，因此要求该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>必须是有返回值的。例如： printf("%d",max(x,y)); 即是把max调用的返回值又作为printf<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的实参来使用的。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用中还应该注意的一个问题是求值顺序的问题。 所谓求值顺序是指对实参表中各量是自左至右使用呢，还是自右至左使用。 对此， 各系统的规定不一定相同。在3.1.3节介绍printf <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>时已提<br>到过，这里从<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的角度再强调一下。 看例5.2程序。<br><font color=#009900>void main()<br>{<br>int i=8;<br>printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);<br>}<br></font>如按照从右至左的顺序求值。例5.2的运行结果应为：<br>8<br>7<br>7<br>8<br>如对printf语句中的++i，--i，i++，i--从左至右求值，结果应为：<br>9<br>8<br>8<br>9<br>　　应特别注意的是，无论是从左至右求值， 还是自右至左求值，其输出顺序都是不变的， 即输出顺序总是和实参表中实参的顺序相同。由于Turbo C现定是自右至左求值，所以结果为8，7，7，8。上述问题如还不理解，上机一试就明白了。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的参数和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值<br>一、<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的参数<br>　　前面已经介绍过，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的参数分为形参和实参两种。 在本小节中，进一步介绍形参、实参的特点和两者的关系。 形参出现在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义中，在整个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体内都可以使用， 离开该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>则不能使用。实参出现在主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中，进入被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后，实参变量也不能使用。 形参和实参的功能是作数据传送。发生<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时， 主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>把实参的值传送给被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参从而实现主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>向被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的数据传送。<br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参和实参具有以下特点：<br>1.形参变量只有在被调用时才分配内存单元，在调用结束时， 即刻释放所分配的内存单元。因此，形参只有在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内部有效。 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用结束返回主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后则不能再使用该形参变量。<br><br>2.实参可以是常量、变量、表达式、<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>等， 无论实参是何种类型的量，在进行<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时，它们都必须具有确定的值， 以便把这些值传送给形参。 因此应预先用赋值，输入等办法使实参获得确定值。<br><br>3.实参和形参在数量上，类型上，顺序上应严格一致， 否则会发生&#8220;类型不匹配&#8221;的错误。<br><br>4.<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用中发生的数据传送是单向的。 即只能把实参的值传送给形参，而不能把形参的值反向地传送给实参。 因此在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用过程中，形参的值发生改变，而实参中的值不会变化。例5.3可以说明这个问题。<br><font color=#009900>void main()<br>{<br>int n;<br>printf("input number\n");<br>scanf("%d",&amp;n);<br>s(n);<br>printf("n=%d\n",n);<br>}<br>int s(int n)<br>{<br>int i;<br>for(i=n-1;i&gt;=1;i--)<br>n=n+i;<br>printf("n=%d\n",n);<br>}<br></font>本程序中定义了一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>s，该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的功能是求∑ni=1i 的值。在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中输入n值，并作为实参，在调用时传送给s <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参量n( 注意，本例的形参变量和实参变量的标识符都为n， 但这是两个不同的量，各自的作用域不同)。 在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中用printf 语句输出一次n值，这个n值是实参n的值。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>s中也用printf 语句输出了一次n值，这个n值是形参最后取得的n值0。从运行情况看，输入n值为100。即实参n的值为100。把此值传给<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>s时，形参 n 的初值也为100，在执行<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>过程中，形参n的值变为5050。 返回主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之后，输出实参n的值仍为100。可见实参的值不随形参的变化而变化。
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:17 <a href="http://www.cnitblog.com/zhangjiang838/articles/26505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26503.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:15:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26503.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26503.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26503.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26503.html</trackback:ping><description><![CDATA[<font color=#ff0000>二、数组名作为</font><a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><font color=#ff0000>参数<br><br></font>　　用数组名作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数与用数组元素作实参有几点不同：<br>1. 用数组元素作实参时，只要数组类型和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参变量的类型一致，那么作为下标变量的数组元素的类型也和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>形参变量的类型是一致的。因此， 并不要求<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参也是下标变量。 换句话说，对数组元素的处理是按普通变量对待的。用数组名作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时， 则要求形参和相对应的实参都必须是类型相同的数组，都必须有明确的数组说明。当形参和实参二者不一致时，即会发生错误。<br><br>2. 在普通变量或下标变量作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时，形参变量和实参变量是由编译系统分配的两个不同的内存单元。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时，不是进行值的传送，即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在，编译系统不为形参数组分配内存。那么，数据的传送是如何实现的呢? 在第四章中我们曾介绍过，数组名就是数组的首地址。因此在数组名作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时所进行的传送只是地址的传送， 也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后，也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组，共同拥有一段内存空间。图5.1说明了这种情形。图中设a为实参数组，类型为整型。a占有以2000 为首地址的一块内存区。b为形参数组名。当发生<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时，进行地址传送， 把实参数 组a的首地址传送给形参数组名b，于是b也取得该地址2000。 于是a，b两数组共同占有以2000 为首地址的一段连续内存单元。从图中还可以看出a和b下标相同的元素实际上也占相同的两个内<br>存单元(整型数组每个元素占二字节)。例如a[0]和b[0]都占用2000和2001单元，当然a[0]等于b[0]。类推则有a[i]等于b[i]。<br>[例5.5]数组a中存放了一个学生5门课程的成绩，求平均成绩。<br><font color=#009900>float aver(float a[5])<br>{<br>int i;<br>float av</font><font color=#009900>,s=a[0]; <br>for(i=1;i&lt;5;i++) <br>s=s+a[i];<br>av=s/5;<br>return av;<br>}<br>void main()<br>{<br>float sco[5],av;<br>int i;<br>printf("\ninput 5 scores:\n");<br>for(i=0;i&lt;5;i++)<br>scanf("%f",&amp;sco[i]);<br>av=aver(sco);<br>printf("average score is %5.2f",av);<br>}<br>float aver(float a[5])<br>{ &#8230;&#8230;<br>}<br>void main()<br>{<br>&#8230;&#8230;<br>for(i=0;i&lt;5;i++)<br>scanf("%f",&amp;sco[i]);<br>av=aver(sco);<br>&#8230;&#8230;<br>}</font> <br>　　本程序首先定义了一个实型<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>aver，有一个形参为实型数组a，长度为5。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>aver中，把各元素值相加求出平均值，返回给主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>main 中首先完成数组sco的输入，然后以sco作为实参调用aver<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值送av，最后输出av值。 从运行情况可以看出，程序实现了所要求的功能<br><br>3. 前面已经讨论过，在变量作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时，所进行的值传送是单向的。即只能从实参传向形参，不能从形参传回实参。形参的初值和实参相同， 而形参的值发生改变后，实参并不变化， 两者的终值是不同的。例5.3证实了这个结论。 而当用数组名作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时，情况则不同。 由于实际上形参和实参为同一数组， 因此当形参数组发生变化时，实参数组也随之变化。 当然这种情况不能理解为发生了&#8220;双向&#8221;的值传递。但从实际情况来看，调用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之后实参数组的值将由于形参数组值的变化而变化。为了说明这种情况，把例5.4改为例5.6的形式。[例5.6]题目同5.4例。改用数组名作<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数。<br><font color=#009900>void nzp(int a[5])<br>{<br>int i;<br>printf("\nvalues of array a are:\n");<br>for(i=0;i&lt;5;i++)<br>{<br>if(a[i]&lt;0) a[i]=0;<br>printf("%d ",a[i]);<br>}<br>}<br>main()<br>{<br>int b[5],i;<br>printf("\ninput 5 numbers:\n");<br>for(i=0;i&lt;5;i++)<br>scanf("%d",&amp;b[i]);<br>printf("initial values of array b are:\n");<br>for(i=0;i&lt;5;i++)<br>printf("%d ",b[i]);<br>nzp(b);<br>printf("\nlast values of array b are:\n");<br>for(i=0;i&lt;5;i++)<br>printf("%d ",b[i]);<br>}<br>void nzp(int a[5])<br>{ &#8230;&#8230; <br>}<br>main()<br>{<br>int b[5],i;<br>&#8230;&#8230;<br>nzp(b);<br>&#8230;&#8230;<br>}</font><br>　　本程序中<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>nzp的形参为整数组a，长度为 5。 主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中实参数组b也为整型，长度也为5。在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中首先输入数组b的值，然后输出数组b的初始值。 然后以数组名b为实参调用nzp<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。在nzp中，按要求把负值单元清0，并输出形参数组a的值。 返回主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之后，再次输出数组b的值。从运行结果可以看出，数组b 的初值和终值是不同的，数组b 的终值和数组a是相同的。这说明实参形参为同一数组，它们的值同时得以改变。 用数组名作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时还应注意以下几点：<br>a. 形参数组和实参数组的类型必须一致，否则将引起错误。<br>b. 形参数组和实参数组的长度可以不相同，因为在调用时，只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时，虽不至于出现语法错误(编译能通过)，但程序执行结果将与实际不符，这是应予以注意的。如把例5.6修改如下：<br><font color=#009900>void nzp(int a[8])<br>{<br>int i;<br>printf("\nvalues of array aare:\n");<br>for(i=0;i&lt;8;i++)<br>{<br>if(a[i]&lt;0)a[i]=0;<br>printf("%d",a[i]);<br>}<br>}<br>main()<br>{<br>int b[5],i;<br>printf("\ninput 5 numbers:\n");<br>for(i=0;i&lt;5;i++)<br>scanf("%d",&amp;b[i]);<br>printf("initial values of array b are:\n");<br>for(i=0;i&lt;5;i++)<br>printf("%d",b[i]);<br>nzp(b);<br>printf("\nlast values of array b are:\n");<br>for(i=0;i&lt;5;i++)<br>printf("%d",b[i]);<br>}<br></font>　　本程序与例5.6程序比，nzp<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参数组长度改为8，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体中，for语句的循环条件也改为i&lt;8。因此，形参数组 a和实参数组b的长度不一致。编译能够通过，但从结果看，数组a的元素a[5]，a[6]，a[7]显然是无意义的。c. 在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>形参表中，允许不给出形参数组的长度，或用一个变量来表示数组元素的个数。<br>例如：可以写为：<br>void nzp(int a[])<br>或写为<br>void nzp(int a[]，int n)<br>　　其中形参数组a没有给出长度，而由n值动态地表示数组的长度。n的值由主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的实参进行传送。<br>由此，例5.6又可改为例5.7的形式。<br>[例5.7]<br><font color=#009900>void nzp(int a[],int n)<br>{<br>int i;<br>printf("\nvalues of array a are:\n");<br>for(i=0;i&lt;n;i++)<br>{<br>if(a[i]&lt;0) a[i]=0;<br>printf("%d ",a[i]);<br>}<br>}<br>main()<br>{<br>int b[5],i;<br>printf("\ninput 5 numbers:\n");<br>for(i=0;i&lt;5;i++)<br>scanf("%d",&amp;b[i]);<br>printf("initial values of array b are:\n");<br>for(i=0;i&lt;5;i++)<br>printf("%d ",b[i]);<br>nzp(b,5);<br>printf("\nlast values of array b are:\n");<br>for(i=0;i&lt;5;i++)<br>printf("%d ",b[i]);<br>}<br>void nzp(int a[],int n)<br>{ &#8230;&#8230;<br>}<br>main()<br>{<br>&#8230;&#8230;<br>nzp(b,5);<br>&#8230;&#8230;<br>}<br>　　</font>本程序nzp<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>形参数组a没有给出长度，由n 动态确定该长度。在main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用语句为nzp(b，5)，其中实参5将赋予形参n作为形参数组的长度。<br>d. 多维数组也可以作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的参数。 在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义时对形参数组可以指定每一维的长度，也可省去第一维的长度。因此，以下写法都是合法的。 <br>int MA(int a[3][10])<br>或<br>int MA(int a[][10])
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:15 <a href="http://www.cnitblog.com/zhangjiang838/articles/26503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26502.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:14:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26502.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26502.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26502.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26502.html</trackback:ping><description><![CDATA[<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><font color=#ff0000>的嵌套调用<br><br></font>　　Ｃ语言中不允许作嵌套的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义。因此各<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之间是平行的，不存在上一级<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和下一级<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的问题。 但是Ｃ语言允许在一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的定义中出现对另一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的调用。 这样就出现了<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的嵌套调用。即在被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中又调用其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。 这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图5.2。<br><br>　　图5.2表示了两层嵌套的情形。其执行过程是：执行main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中调用a<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的语句时，即转去执行a<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，在a<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中调用b <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>时，又转去执行b<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，b<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>执行完毕返回a<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的断点继续执行，a <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>执行完毕返回main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的断点继续执行。<br>[例5.8]计算s=22!+32!<br>本题可编写两个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，一个是用来计算平方值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1， 另一个是用来计算阶乘值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f2。主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>先调f1计算出平方值， 再在f1中以平方值为实参，调用 f2计算其阶乘值，然后返回f1，再返回主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，在循环程序中计算累加和。<br><font color=#009900>long f1(int p)<br>{<br>int k;<br>long r;<br>long f2(int);<br>k=p*p;<br>r=f2(k);<br>return r;<br>}<br>long f2(int q)<br>{<br>long c=1;<br>int i;<br>for(i=1;i&lt;=q;i++)<br>c=c*i;<br>return c;<br>}<br>main()<br>{<br>int i;<br>long s=0;<br>for (i=2;i&lt;=3;i++)<br>s=s+f1(i);<br>printf("\ns=%ld\n",s);<br>}<br>long f1(int p)<br>{<br>&#8230;&#8230;<br>long f2(int);<br>r=f2(k);<br>&#8230;&#8230;<br>}<br>long f2(int q)<br>{ <br>&#8230;&#8230;<br>}<br>main()<br>{ &#8230;&#8230;<br>s=s+f1(i);<br>&#8230;&#8230;<br>}<br></font>　　在程序中，<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1和f2均为长整型，都在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之前定义， 故不必再在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中对f1和f2加以说明。在主程序中， 执行循环程序依次把i值作为实参调用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1求i2值。在f1中又发生对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f2的调用，这时是把i2的值作为实参去调f2，在f2 中完成求i2! 的计算。f2执行完毕把C值(即i2!)返回给f1，再由f1 返回主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>实现累加。至此，由<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的嵌套调用实现了题目的要求。 由于数值很大， 所以<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>和一些变量的类型都说明为长整型，否则会造成计算错误
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:14 <a href="http://www.cnitblog.com/zhangjiang838/articles/26502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26501.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:13:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26501.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26501.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26501.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26501.html</trackback:ping><description><![CDATA[<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><font color=#ff0000>的递归调用<br><br></font>　　一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>在它的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>体内调用它自身称为递归调用。 这种<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>称为递归<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。Ｃ语言允许<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的递归调用。在递归调用中， 主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>又是被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。执行递归<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>将反复调用其自身。 每调用一次就进入新的一层。例如有<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f如下：<br><font color=#009900>int f (int x)<br>{<br>int y;<br>z=f(y);<br>return z;<br>}<br></font>　　这个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是一个递归<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。 但是运行该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>将无休止地调用其自身，这当然是不正确的。为了防止递归调用无终止地进行， 必须在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内有终止递归调用的手段。常用的办法是加条件判断， 满足某种条件后就不再作递归调用，然后逐层返回。 下面举例说明递归调用的执行过程。<br>[例5.9]用递归法计算n!用递归法计算n!可用下述公式表示：<br>n!=1 (n=0,1)<br>n&#215;(n-1)! (n&gt;1)<br>按公式可编程如下：<br><font color=#009900>long ff(int n)<br>{<br>long f;<br>if(n&lt;0) printf("n&lt;0,input error");<br>else if(n==0||n==1) f=1;<br>else f=ff(n-1)*n;<br>return(f);<br>}<br>main()<br>{<br>int n;<br>long y;<br>printf("\ninput a inteager number:\n");<br>scanf("%d",&amp;n);<br>y=ff(n);<br>printf("%d!=%ld",n,y);<br>}<br>long ff(int n)<br>{ &#8230;&#8230;<br>else f=ff(n-1)*n;<br>&#8230;&#8230;<br>}<br>main()<br>{ &#8230;&#8230;<br>y=ff(n);<br>&#8230;&#8230;<br>}</font> <br>　　程序中给出的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>ff是一个递归<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用ff 后即进入<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>ff执行，如果n&lt;0,n==0或n=1时都将结束<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的执行，否则就递归调用ff<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>自身。由于每次递归调用的实参为n-1，即把n-1 的值赋予形参n，最后当n-1的值为1时再作递归调用，形参n的值也为1，将使递归终止。然后可逐层退回。下面我们再举例说明该过程。 设执行本程序时输入为5， 即求 5!。在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中的调用语句即为y=ff(5)，进入ff<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后，由于n=5,不等于0或1，故应执行f=ff(n-1)*n,即f=ff(5-1)*5。该语句对ff作递归调用即ff(4)。 逐次递归展开如图5.3所示。进行四次递归调用后，ff<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>形参取得的值变为1，故不再继续递归调用而开始逐层返回主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。ff(1)的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值为1，ff(2)的返回值为1*2=2，ff(3)的返回值为2*3=6，ff(4) 的返<br>回值为6*4=24，最后返回值ff(5)为24*5=120。<br><br>　　例5. 9也可以不用递归的方法来完成。如可以用递推法，即从1开始乘以2，再乘以3&#8230;直到n。递推法比递归法更容易理解和实现。但是有些问题则只能用递归算法才能实现。典型的问题是Hanoi塔问题。<br>　　<br>　　[例5.10]Hanoi塔问题<br>一块板上有三根针，A，B，C。A针上套有64个大小不等的圆盘， 大的在下，小的在上。如图5.4所示。要把这64个圆盘从A针移动C针上，每次只能移动一个圆盘，移动可以借助B针进行。但在任何时候，任何针上的圆盘都必须保持大盘在下，小盘在上。求移动的步骤。<br>本题算法分析如下，设A上有n个盘子。<br>如果n=1，则将圆盘从A直接移动到C。<br>如果n=2，则：<br>1.将A上的n-1(等于1)个圆盘移到B上；<br>2.再将A上的一个圆盘移到C上；<br>3.最后将B上的n-1(等于1)个圆盘移到C上。<br>如果n=3，则：<br>A. 将A上的n-1(等于2，令其为n`)个圆盘移到B(借助于C)， <br>步骤如下：<br>(1)将A上的n`-1(等于1)个圆盘移到C上，见图5.5(b)。<br>(2)将A上的一个圆盘移到B，见图5.5(c)<br>(3)将C上的n`-1(等于1)个圆盘移到B，见图5.5(d)<br>B. 将A上的一个圆盘移到C，见图5.5(e)<br>C. 将B上的n-1(等于2，令其为n`)个圆盘移到C(借助A)，<br>步骤如下：<br>(1)将B上的n`-1(等于1)个圆盘移到A，见图5.5(f)<br>(2)将B上的一个盘子移到C，见图5.5(g)<br>(3)将A上的n`-1(等于1)个圆盘移到C，见图5.5(h)。<br>到此，完成了三个圆盘的移动过程。<br>从上面分析可以看出，当n大于等于2时， 移动的过程可分解为<br>三个步骤：<br>第一步 把A上的n-1个圆盘移到B上；<br>第二步 把A上的一个圆盘移到C上；<br>第三步 把B上的n-1个圆盘移到C上；其中第一步和第三步是类同的。 <br>当n=3时，第一步和第三步又分解为类同的三步，即把n`-1个圆盘从一个针移到另一个针上，这里的n`=n-1。 显然这是一个递归过<br>程，据此算法可编程如下：<br><font color=#009900>move(int n,int x,int y,int z)<br>{<br>if(n==1)<br>printf("%c--&gt;%c\n",x,z);<br>else<br>{<br>move(n-1,x,z,y);<br>printf("%c--&gt;%c\n",x,z);<br>move(n-1,y,x,z);<br>}<br>}<br>main()<br>{<br>int h;<br>printf("\ninput number:\n");<br>scanf("%d",&amp;h);<br>printf("the step to moving %2d diskes:\n",h);<br>move(h,'a','b','c');<br>}<br>move(int n,int x,int y,int z)<br>{<br>if(n==1)<br>printf("%--&gt;%c\n",x,z);<br>else<br>{<br>move(n-1,x,z,y);<br>printf("%c--&gt;%c\n",x,z);<br>move(n-1,y,x,z);<br>}<br>}<br>main()<br>{ &#8230;&#8230;<br>move(h,'a','b','c');<br>}<br></font>　　从程序中可以看出,move<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是一个递归<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，它有四个形参n,x,y,z。n表示圆盘数，x,y,z分别表示三根针。move <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的功能是把x上的n个圆盘移动到z 上。当n==1时，直接把x上的圆盘移至z上，输出x&#8594;z。如n!=1则分为三步：递归调用move<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，把n-1个圆盘从x移到y；输出x&#8594;z；递归调用move<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，把n-1个圆盘从y移到z。在递归调用过程中n=n-1，故n的值逐次递减，最后n=1时，终止递归，逐层返回。当n=4 时程序运行的结果为<br><font color=#009900>input number:<br>4<br>the step to moving 4 diskes:<br>a&#8594;b<br>a&#8594;c<br>b&#8594;c<br>a&#8594;b<br>c&#8594;a<br>c&#8594;b<br>a&#8594;b<br>a&#8594;c<br>b&#8594;c<br>b&#8594;a<br>c&#8594;a<br>b&#8594;c<br>a&#8594;b<br>a&#8594;c<br>b&#8594;c</font><br><br><font color=#ff0000>变量的作用域</font><br><br>　　在讨论<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参变量时曾经提到， 形参变量只在被调用期间才分配内存单元，调用结束立即释放。 这一点表明形参变量只有在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内才是有效的， 离开该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量， Ｃ语言中所有的量都有自己的作用域。变量说明的方式不同，其作用域也不同。 Ｃ语言中的变量，按作用域范围可分为两种， 即局部变量和全局变量。
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:13 <a href="http://www.cnitblog.com/zhangjiang838/articles/26501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26499.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:12:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26499.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26499.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26499.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26499.html</trackback:ping><description><![CDATA[<font color=#ff0000>变量的存储方式可分为&#8220;静态存储&#8221;和&#8220;动态存储&#8221;两种。</font> <br><br>　　静态存储变量通常是在变量定义时就分定存储单元并一直保持不变， 直至整个程序结束。5.5.1节中介绍的全局变量即属于此类存储方式。动态存储变量是在程序执行过程中，使用它时才分配存储单元， 使用完毕立即释放。 典型的例子是<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形式参数，在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义时并不给形参分配存储单元，只是在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>被调用时，才予以分配， 调用<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>完毕立即释放。如果一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>被多次调用，则反复地分配、 释放形参变量的存储单元。从以上分析可知， 静态存储变量是一直存在的， 而动态存储变量则时而存在时而消失。我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。 生存期表示了变量存在的时间。 生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性，这两者既有联系，又有区别。 一个变量究竟属于哪一种存储方式， 并不能仅从其作用域来判断，还应有明确的存储类型说明。<br><br>　　在Ｃ语言中，对变量的存储类型说明有以下四种：<br>auto　　　　 自动变量<br>register 　　寄存器变量<br>extern 　　　外部变量<br>static 　　　静态变量 <br>　　自动变量和寄存器变量属于动态存储方式， 外部变量和静态变量属于静态存储方式。在介绍了变量的存储类型之后， 可以知道对一个变量的说明不仅应说明其数据类型，还应说明其存储类型。 因此变量说明的完整形式应为： 存储类型说明符 数据类型说明符 变量名，变量名&#8230;； 例如：<br>static int a,b; 　　　　　　　　　 说明a,b为静态类型变量<br>auto char c1,c2; 　　　　　　　　　说明c1,c2为自动字符变量<br>static int a[5]={1,2,3,4,5}; 　　　说明a为静整型数组<br>extern int x,y; 　　　　　　　　　 说明x,y为外部整型变量<br>下面分别介绍以上四种存储类型：<br><br>一、自动变量的类型说明符为auto。<br>　　这种存储类型是Ｃ语言程序中使用最广泛的一种类型。Ｃ语言规定， <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内凡未加存储类型说明的变量均视为自动变量， 也就是说自动变量可省去说明符auto。 在前面各章的程序中所定义的变量凡未加存储类型说明符的都是自动变量。例如：<br><font color=#009900>{ int i,j,k;<br>char c;<br>&#8230;&#8230;<br>}等价于： { auto int i,j,k;<br>auto char c;<br>&#8230;&#8230;<br>}<br></font>　　自动变量具有以下特点：<br>1. 自动变量的作用域仅限于定义该变量的个体内。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中定义的自动变量，只在该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内有效。在复合语句中定义的自动变量只在该复合语句中有效。 例如： <br><font color=#009900>int kv(int a)<br>{<br>auto int x,y;<br>{ auto char c; <br>} /*c的作用域*/<br>&#8230;&#8230;<br>} /*a,x,y的作用域*/<br></font><br>2. 自动变量属于动态存储方式，只有在使用它，即定义该变量的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>被调用时才给它分配存储单元，开始它的生存期。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用结束，释放存储单元，结束生存期。因此<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用结束之后，自动变量的值不能保留。在复合语句中定义的自动变量，在退出复合语句后也不能再使用，否则将引起错误。例如以下程序： <br><font color=#009900>main()<br>{ auto int a,s,p;<br>printf("\ninput a number:\n");<br>scanf("%d",&amp;a);<br>if(a&gt;0){<br>s=a+a;<br>p=a*a;<br>}<br>printf("s=%d p=%d\n",s,p);<br>}<br><br></font>s,p是在复合语句内定义的自动变量，只能在该复合语句内有效。而程序的第9行却是退出复合语句之后用printf语句输出s,p的值，这显然会引起错误。<br><br>3. 由于自动变量的作用域和生存期都局限于定义它的个体内( <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>或复合语句内)， 因此不同的个体中允许使用同名的变量而不会混淆。 即使在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内定义的自动变量也可与该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内部的复合语句中定义的自动变量同名。例5.14表明了这种情况。<br>[例5.14]<br><font color=#009900>main()<br>{<br>auto int a,s=100,p=100;<br>printf("\ninput a number:\n");<br>scanf("%d",&amp;a);<br>if(a&gt;0)<br>{<br>auto int s,p;<br>s=a+a;<br>p=a*a;<br>printf("s=%d p=%d\n",s,p);<br>}<br>printf("s=%d p=%d\n",s,p);<br>}<br></font>　　本程序在main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中和复合语句内两次定义了变量s,p为自动变量。按照Ｃ语言的规定，在复合语句内，应由复合语句中定义的s,p起作用，故s的值应为a+ a，p的值为a*a。退出复合语句后的s,p 应为main所定义的s,p，其值在初始化时给定，均为100。从输出结果可以分析出两个s和两个p虽变量名相同， 但却是两个不同的变量。<br><br>4. 对构造类型的自动变量如数组等，不可作初始化赋值。<br><br><font color=#ff0000>二、外部变量外部变量的类型说明符为extern。</font><br><br>在前面介绍全局变量时已介绍过外部变量。这里再补充说明外部变量的几个特点：<br>1. 外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变是是从它的作用域提出的，外部变量从它的存储方式提出的，表示了它的生存期。<br><br>2. 当一个源程序由若干个源文件组成时， 在一个源文件中定义的外部变量在其它的源文件中也有效。例如有一个源程序由源文件F1.C和F2.C组成： <font color=#009900>F1.C<br>int a,b; /*外部变量定义*/<br>char c; /*外部变量定义*/<br>main()<br>{ <br>&#8230;&#8230;<br>}<br>F2.C<br>extern int a,b; /*外部变量说明*/<br>extern char c; /*外部变量说明*/<br>func (int x,y)<br>{<br>&#8230;&#8230;<br>}<br></font>在F1.C和F2.C两个文件中都要使用a,b,c三个变量。在F1.C文件中把a,b,c都定义为外部变量。在F2.C文件中用extern把三个变量说明为外部变量，表示这些变量已在其它文件中定义，并把这些变量的类型和变量名，编译系统不再为它们分配内存空间。 对构造类型的外部变量， 如数组等可以在说明时作初始化赋值，若不赋初值，则系统自动定义它们的初值为0。<br><font color=#ff0000></font>
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:12 <a href="http://www.cnitblog.com/zhangjiang838/articles/26499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26500.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:12:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26500.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26500.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26500.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26500.html</trackback:ping><description><![CDATA[<font color=#ff0000>一、局部变量<br><br></font>　　局部变量也称为内部变量。局部变量是在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内作定义说明的。其作用域仅限于<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内， 离开该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后再使用这种变量是非法的。<br>例如：<br><font color=#009900>int f1(int a) /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1*/<br>{<br>int b,c; <br>&#8230;&#8230;<br>}a,b,c作用域<br>int f2(int x) /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f2*/<br>{<br>int y,z; <br>}x,y,z作用域<br>main()<br>{<br>int m,n; <br>}</font><font color=#ff0000><br></font>m,n作用域 在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1内定义了三个变量，a为形参，b,c为一般变量。在 f1的范围内a,b,c有效，或者说a,b,c变量的作用域限于f1内。同理，x,y,z的作用域限于f2内。 m,n的作用域限于main<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内。关于局部变量的作用域还要说明以下几点：<br><br>1. 主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中定义的变量也只能在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中使用，不能在其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中使用。同时，主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中也不能使用其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中定义的变量。因为主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>也是一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，它与其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>是平行关系。这一点是与其它语言不同的，应予以注意。<br><br>2. 形参变量是属于被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的局部变量，实参变量是属于主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的局部变量。<br><br>3. 允许在不同的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中使用相同的变量名，它们代表不同的对象，分配不同的单元，互不干扰，也不会发生混淆。如在例5.3 中，形参和实参的变量名都为n，是完全允许的。4. 在复合语句中也可定义变量，其作用域只在复合语句范围内。例如：<br><font color=#009900>main()<br>{<br>int s,a;<br>&#8230;&#8230;<br>{<br>int b;<br>s=a+b; <br>&#8230;&#8230;b作用域 <br>}<br>&#8230;&#8230;s,a作用域<br>}[例5.11]main()<br>{<br>int i=2,j=3,k;<br>k=i+j;<br>{<br>int k=8;<br>if(i==3) printf("%d\n",k);<br>}<br>printf("%d\n%d\n",i,k);<br>}<br>main()<br>{<br>int i=2,j=3,k;<br>k=i+j;<br>{<br>int k=8;<br>if(i=3) printf("%d\n",k);<br>}<br>printf("%d\n%d\n",i,k);<br>}</font> <br>　　本程序在main中定义了i,j,k三个变量，其中k未赋初值。 而在复合语句内又定义了一个变量k，并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用，而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义，其值应为5。第7行输出k值，该行在复合语句内，由复合语句内定义的k起作用，其初值为8，故输出值为8，第9行输出i，k值。i是在整个程序中有效的，第7行对i赋值为3，故以输出也为3。而第9行已在复合语句之外，输出的k应为main所定义的k，此k值由第4 行已获得为5，故输出也为5。<br><br><font color=#ff0000>二、全局变量</font><br><br>全局变量也称为外部变量，它是在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>外部定义的变量。 它不属于哪一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，它属于一个源程序文件。其作用域是整个源程序。在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中使用全局变量，一般应作全局变量说明。 只有在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内经过说明的全局变量才能使用。全局变量的说明符为extern。 但在一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之前定义的全局变量，在该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内使用可不再加以说明。 例如：<br><font color=#009900>int a,b; /*外部变量*/<br>void f1() /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1*/<br>{<br>&#8230;&#8230;<br>}<br>float x,y; /*外部变量*/ <br>int fz() /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>fz*/<br>{<br>&#8230;&#8230;<br>}<br>main() /*主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>*/<br>{<br>&#8230;&#8230;<br>}/*全局变量x,y作用域 全局变量a,b作用域*/<br></font>　　从上例可以看出a、b、x、y 都是在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>外部定义的外部变量，都是全局变量。但x,y 定义在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f1之后，而在f1内又无对x,y的说明，所以它们在f1内无效。 a,b定义在源程序最前面，因此在f1,f2及main内不加说明也可使用。<br><br>[例5.12]输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。<br><font color=#009900>int s1,s2,s3;<br>int vs( int a,int b,int c)<br>{<br>int v;<br>v=a*b*c;<br>s1=a*b;<br>s2=b*c;<br>s3=a*c;<br>return v;<br>}<br>main()<br>{<br>int v,l,w,h;<br>printf("\ninput length,width and height\n");<br>scanf("%d%d%d",&amp;l,&amp;w,&amp;h);<br>v=vs(l,w,h);<br>printf("v=%d s1=%d s2=%d s3=%d\n",v,s1,s2,s3);<br>}<br></font>　　本程序中定义了三个外部变量s1,s2,s3， 用来存放三个面积，其作用域为整个程序。<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>vs用来求正方体体积和三个面积， <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的返回值为体积v。由主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>完成长宽高的输入及结果输出。由于Ｃ语言规定<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>返回值只有一个， 当需要增加<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的返回数据时，用外部变量是一种很好的方式。本例中，如不使用外部变量， 在主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中就不可能取得v,s1,s2,s3四个值。而采用了外部变量， 在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>vs中求得的s1,s2,s3值在main 中仍然有效。因此外部变量是实现<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之间数据通讯的有效手段。对于全局变量还有以下几点说明：<br><br>1. 对于局部变量的定义和说明，可以不加区分。而对于外部变量则不然，外部变量的定义和外部变量的说明并不是一回事。外部变量定义必须在所有的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之外，且只能定义一次。其一般形式为： [extern] 类型说明符 变量名，变量名&#8230; 其中方括号内的extern可以省去不写。<br>例如： int a,b;<br>等效于：<br>extern int a,b;<br>　　而外部变量说明出现在要使用该外部变量的各个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内， 在整个程序内，可能出现多次，外部变量说明的一般形式为： extern 类型说明符 变量名，变量名，&#8230;； 外部变量在定义时就已分配了内存单元， 外部变量定义可作初始赋值，外部变量说明不能再赋初始值， 只是表明在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内要使用某外部变量。<br><br>2. 外部变量可加强<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>模块之间的数据联系， 但是又使<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>要依赖这些变量，因而使得<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的独立性降低。从模块化程序设计的观点来看这是不利的， 因此在不必要时尽量不要使用全局变量。<br><br>3. 在同一源文件中，允许全局变量和局部变量同名。在局部变量的作用域内，全局变量不起作用。<font color=#009900><br>[例5.13]int vs(int l,int w)<br>{<br>extern int h;<br>int v;<br>v=l*w*h;<br>return v;<br>}<br>main()<br>{<br>extern int w,h;<br>int l=5;<br>printf("v=%d",vs(l,w));<br>}<br>int l=3,w=4,h=5;<br></font>　　本例程序中，外部变量在最后定义， 因此在前面<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中对要用的外部变量必须进行说明。外部变量l，w和vs<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的形参l，w同名。外部变量都作了初始赋值，mian<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中也对l作了初始化赋值。执行程序时，在printf语句中调用vs<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>，实参l的值应为main中定义的l值，等于5，外部变量l在main内不起作用；实参w的值为外部变量w的值为4，进入vs后这两个值传送给形参l，wvs<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中使用的h 为外部变量，其值为5，因此v的计算结果为100，返回主<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后输出。变量的存储类型各种变量的作用域不同， 就其本质来说是因变量的存储类型相同。所谓存储类型是指变量占用内存空间的方式， 也称为存储方式。
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:12 <a href="http://www.cnitblog.com/zhangjiang838/articles/26500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26498.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:11:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26498.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26498.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26498.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26498.html</trackback:ping><description><![CDATA[<font color=#ff0000>三、静态变量<br><br></font>　　静态变量的类型说明符是static。 静态变量当然是属于静态存储方式，但是属于静态存储方式的量不一定就是静态变量， 例如外部变量虽属于静态存储方式，但不一定是静态变量，必须由 static加以定义后才能成为静态外部变量，或称静态全局变量。 对于自动变量，前面已经介绍它属于动态存储方式。 但是也可以用static定义它为静态自动变量，或称静态局部变量，从而成为静态存储方式。<br>由此看来， 一个变量可由static进行再说明，并改变其原有的存储方式。<br><br>1. 静态局部变量<br>　　在局部变量的说明前再加上static说明符就构成静态局部变量。<br>例如：<br>static int a,b;<br>static float array[5]={1,2,3,4,5}；<br>　　<br>　　静态局部变量属于静态存储方式，它具有以下特点：<br>(1)静态局部变量在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内定义，但不象自动变量那样，当调用时就存在，退出<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>时就消失。静态局部变量始终存在着，也就是说它的生存期为整个源程序。<br><br>(2)静态局部变量的生存期虽然为整个源程序，但是其作用域仍与自动变量相同，即只能在定义该变量的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>内使用该变量。退出该<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后， 尽管该变量还继续存在，但不能使用它。<br><br>(3)允许对构造类静态局部量赋初值。在数组一章中，介绍数组初始化时已作过说明。若未赋以初值，则由系统自动赋以0值。<br><br>(4)对基本类型的静态局部变量若在说明时未赋以初值，则系统自动赋予0值。而对自动变量不赋初值，则其值是不定的。 根据静态局部变量的特点， 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>后不能使用，但如再次调用定义它的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>时，它又可继续使用， 而且保存了前次被调用后留下的值。 因此，当多次调用一个<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>且要求在调用之间保留某些变量的值时，可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的，但全局变量有时会造成意外的副作用，因此仍以采用局部静态变量为宜。<br><font color=#009900>[例5.15]main()<br>{<br>int i;<br>void f(); /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明*/<br>for(i=1;i&lt;=5;i++)<br>f(); /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用*/<br>}<br>void f() /*<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义*/<br>{<br>auto int j=0;<br>++j;<br>printf("%d\n",j);<br>}<br></font>　　程序中定义了<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>f，其中的变量j 说明为自动变量并赋予初始值为0。当main中多次调用f时，j均赋初值为0，故每次输出值均为1。现在把j改为静态局部变量，程序如下：<br><font color=#009900>main()<br>{<br>int i;<br>void f();<br>for (i=1;i&lt;=5;i++)<br>f();<br>}<br>void f()<br>{<br>static int j=0;<br>++j;<br>printf("%d\n",j);<br>}<br>void f()<br>{<br>static int j=0;<br>++j;<br>printf("%d/n",j);<br>}</font><br>由于j为静态变量，能在每次调用后保留其值并在下一次调用时继续使用，所以输出值成为累加的结果。读者可自行分析其执行过程。<br><br>2.静态全局变量<br>　　全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式， 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序， 当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域， 即只在定义该变量的源文件内有效， 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>公用， 因此可以避免在其它源文件中引起错误。从以上分析可以看出， 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域， 限制了它<br>的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。<br><br><font color=#ff0000>四、寄存器变量</font><br><br>　　上述各类变量都存放在存储器内， 因此当对一个变量频繁读写时，必须要反复访问内存储器，从而花费大量的存取时间。 为此，Ｃ语言提供了另一种变量，即寄存器变量。这种变量存放在CPU的寄存器中，使用时，不需要访问内存，而直接从寄存器中读写， 这样可提高效率。寄存器变量的说明符是register。 对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。<br><font color=#009900>[例5.16]求∑200i=1imain()<br>{<br>register i,s=0;<br>for(i=1;i&lt;=200;i++)<br>s=s+i;<br>printf("s=%d\n",s);<br>}<br></font>本程序循环200次，i和s都将频繁使用，因此可定义为寄存器变量。<br>对寄存器变量还要说明以下几点：<br><br>1. 只有局部自动变量和形式参数才可以定义为寄存器变量。因为寄存器变量属于动态存储方式。凡需要采用静态存储方式的量不能定义为寄存器变量。<br><br>2. 在Turbo C，MS C等微机上使用的Ｃ语言中， 实际上是把寄存器变量当成自动变量处理的。因此速度并不能提高。 而在程序中允许使用寄存器变量只是为了与标准C保持一致。3. 即使能真正使用寄存器变量的机器，由于CPU 中寄存器的个数是有限的，因此使用寄存器变量的个数也是有限的。
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:11 <a href="http://www.cnitblog.com/zhangjiang838/articles/26498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言教程第五章:函数</title><link>http://www.cnitblog.com/zhangjiang838/articles/26497.html</link><dc:creator>悲惨的狼</dc:creator><author>悲惨的狼</author><pubDate>Mon, 30 Apr 2007 18:10:00 GMT</pubDate><guid>http://www.cnitblog.com/zhangjiang838/articles/26497.html</guid><wfw:comment>http://www.cnitblog.com/zhangjiang838/comments/26497.html</wfw:comment><comments>http://www.cnitblog.com/zhangjiang838/articles/26497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/zhangjiang838/comments/commentRss/26497.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/zhangjiang838/services/trackbacks/26497.html</trackback:ping><description><![CDATA[<font color=#ff0000>内部</font><a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><font color=#ff0000>和外部</font><a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br><br>　　<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>一旦定义后就可被其它<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用。 但当一个源程序由多个源文件组成时， 在一个源文件中定义的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>能否被其它源文件中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用呢?为此，Ｃ语言又把<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>分为两类：<br><br>一、内部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br><br>　　如果在一个源文件中定义的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>只能被本文件中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用，而不能被同一源程序其它文件中的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用， 这种<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>称为内部函 <br>数。定义内部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的一般形式是： static 类型说明符 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名(形参表) 例如：<br>static int f(int a,int b) 内部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>也称为静态<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。但此处静态static 的含义已不是指存储方式，而是指对<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的调用范围只局限于本文件。 因此在不同的源文件中定义同名的静态<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>不会引起混淆。<br><br>二、外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a><br>　　外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>在整个源程序中都有效，其定义的一般形式为： extern 类型说明符 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名(形参表) 例如：<br>extern int f(int a,int b)如在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义中没有说明extern或static则隐含为extern。在一个源文件的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中调用其它源文件中定义的外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>时，应 用extern说明被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>为外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。例如：<br><font color=#009900>F1.C (源文件一)<br>main()<br>{<br>extern int f1(int i); /*外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明，表示f1函<br>数在其它源文件中*/<br>&#8230;&#8230;<br>}<br>F2.C (源文件二)<br>extern int f1(int i); /*外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义*/<br>{<br>&#8230;&#8230;<br>}<br></font><br><strong><font color=#cc0000>本章小结</font></strong><br><br>1. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的分类<br>(1)库<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：由C系统提供的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>；<br>(2)用户定义<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：由用户自己定义的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>；<br>(3)有返回值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>向调用者返回<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值，应说明<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>类型( 即返回值的类型 )；<br>(4)无返回值的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：不返回<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>值，说明为空(void)类型；<br>(5)有参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>向被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>传送数据；<br>(6)无参<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：主调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>与被调<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>间无数据传送；<br>(7)内部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：只能在本源文件中使用的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>；<br>(8)外部<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>：可在整个源程序中使用的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>。<br><br>2. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义的一般形式 <br>[extern/static] 类型说明符 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名([形参表]) 方括号内为可选项。<br><br>3. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>说明的一般形式 [extern] 类型说明符 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名([形参表])； <br><br>4. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用的一般形式 <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>名([实参表]) <br><br>5. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的参数分为形参和实参两种，形参出现在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>定义中，实参出现在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用中，发生<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>调用时，将把实参的值传送给形参。<br><br>6. <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的值是指<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的返回值，它是在<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>中由return语句返回的。<br><br>7. 数组名作为<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>参数时不进行值传送而进行地址传送。形参和实参实际上为同一数组的两个名称。因此形参数组的值发生变化，实参数组的值当然也变化。<br><br>8. Ｃ语言中，允许<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的嵌套调用和<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>的递归调用。<br><br>9. 可从三个方面对变量分类，即变量的数据类型，变量作用域和变量的存储类型。在第二章中主要介绍变量的数据类型，本章中介绍了变量的作用域和变量的存储类型。<br><br>10.变量的作用域是指变量在程序中的有效范围， 分为局部变量和全局变量。<br><br>11.变量的存储类型是指变量在内存中的存储方式，分为静态存储和动态存储，表示了变量的生存期。<br><br>12.变量分类特性表存储方式存储类型说明符何处定义生存期作用域赋值前的值可赋初值类型动态存储自动变量 auto 寄存器变量　register <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>或复合语句内被调用时在定义它的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>或复合语句内不定基本类型int或char外部变量extern<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之外整个源程序整个源程序静态局部变量static <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>或复合语句内静态全局变量static <a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>之外整个源程序在定义它的<a class=channel_keylink href="http://www.bc-cn.net/Article/Search.asp?Field=Title&amp;ClassID=&amp;keyword=%BA%AF%CA%FD">函数</a>或复合语句内在定义它的源文件内0任何类型
<img src ="http://www.cnitblog.com/zhangjiang838/aggbug/26497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/zhangjiang838/" target="_blank">悲惨的狼</a> 2007-05-01 02:10 <a href="http://www.cnitblog.com/zhangjiang838/articles/26497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>