1.1.3 main函数
int main( void ) |
这几行构成了main函数定义的起始部分。每个C程序都必须有一个main函数,因为它是程序执行的起点。关键字int表示函数返回一个整型值,关键字void表示函数不接受任何参数。main函数的函数体包括左花括号和与之相匹配的右花括号之间的任何内容。
请观察一下缩进是如何使程序的结构显得更为清晰的。
int n_columns; /* 进行处理的列标号 */ |
这几行声明了4个变量:一个整型标量,一个整型数组以及两个字符数组。所有4个变量都是main函数的局部变量,其他函数不能根据它们的名字访问它们。当然,它们可以作为参数传递给其他函数。
/* |
这条语句调用函数read_column_numbers。数组columns和MAX_COLS所代表的常量(20)作为参数传递给这个函数。在C语言中,数组参数是以引用(reference)形式进行传递的,也就是传址调用,而标量和常量则是按值(value)传递的(分别类似于Pascal和Modula中的var参数和值参数)。在函数中对标量参数的任何修改都会在函数返回时丢失,因此,被调用函数无法修改调用函数以传值形式传递给它的参数。然而,当被调用函数修改数组参数的其中一个元素时,调用函数所传递的数组就会被实际地修改。
事实上,关于C函数的参数传递规则可以表述如下:
所有传递给函数的参数都是按值传递的。
但是,当数组名作为参数时就会产生按引用传递的效果,如上所示。规则和现实行为之间似乎存在明显的矛盾之处,第8章会对此作出详细解释。
/*
|
用于描述这段代码的注释看上去似乎有些多余。但是,如今软件开销的最大之处并非在于编写,而是在于维护。在修改一段代码时所遇到的第1个问题就是要搞清楚代码的功能。所以,如果你在代码中插入一些东西,能使其他人(或许就是你自己!)在以后更容易理解它,那就非常值得这样做。但是,要注意书写正确的注释,并且在你修改代码时要注意注释的更新。注释如果不正确那还不如没有!
这段代码包含了一个while循环。在C语言中,while循环的功能和它在其他语言中一样。它首先测试表达式的值,如果是假的(0)就跳过循环体。如果表达式的值是真的(非0),就执行循环体内的代码,然后再重新测试表达式的值。
这个循环代表了这个程序的主要逻辑。简而言之,它表示:
while 我们还可以读取另一行输入时 |
gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。一行输入由一串字符组成,以一个换行符(newline)结尾。gets函数丢弃换行符,并在该行的末尾存储一个NUL字节 (一个NUL字节是指字节模式为全0的字节,类似'\0'这样的字符常量)。然后,gets函数返回一个非NULL值,表示该行已被成功读取 。当gets函数被调用但事实上不存在输入行时,它就返回NULL值,表示它到达了输入的末尾(文件尾)。
在C程序中,处理字符串是常见的任务之一。尽管C语言并不存在“string”数据类型,但在整个语言中,存在一项约定:字符串就是一串以NUL字节结尾的字符。NUL是作为字符串终止符,它本身并不被看作是字符串的一部分。字符串常量(string literal)就是源程序中被双引号括起来的一串字符。例如,字符串常量:
"Hello" |
在内存中占据6个字节的空间,按顺序分别是H、e、l、l、o和NUL。
printf函数执行格式化的输出。C语言的格式化输出比较简单,如果你是Modula或Pascal的用户,你肯定会对此感到愉快。printf函数接受多个参数,其中第一个参数是一个字符串,描述输出的格式,剩余的参数就是需要打印的值。格式常常以字符串常量的形式出现。
格式字符串包含格式指定符(格式代码)以及一些普通字符。这些普通字符将按照原样逐字打印出来,但每个格式指定符将使后续参数的值按照它所指定的格式打印。表1.1列出了一些常用的格式指定符。如果数组input包含字符串Hi friend!,那么下面这条语句
printf( "Original input : %s\n", input); 的打印结果是: Original input : Hi friends! |
后面以一个换行符终止。
表1.1 常用printf格式代码
|
格 式 |
含 义 |
|
%d |
以十进制形式打印一个整型值 |
|
%o |
以八进制形式打印一个整型值 |
|
%x |
以十六进制形式打印一个整型值 |
1.NUL是ASCII字符集中‘\0’字符的名字,它的字节模式为全0。NULL指一个其值为0的指针。它们都是整型值,其值也相同,所以它们可以互换使用。然而,你还是应该使用适当的常量,因为它能告诉阅读程序的人不仅使用0这个值,而且告诉他使用这个值的目的。
2.符号NULL在头文件stdio.h中定义。另一方面,并不存在预定义的符号NUL,所以如果你想使用它而不是字符常量‘\0’,你必须自行定义。
续表
|
格 式 |
含 义 |
|
%g |
打印一个浮点值 |
|
%c |
打印一个字符 |
|
%s |
打印一个字符串 |
|
\n |
换行 |
例子程序接下来的一条语句调用rearrange函数。后面3个参数是传递给函数的值,第1个参数则是函数将要创建并返回给main函数的答案。记住,这种参数是唯一可以返回答案的方法,因为它是一个数组。最后一个printf函数显示输入行重新整理后的结果。
最后,当循环结束时,main函数返回值EXIT_SUCCESS。该值向操作系统提示程序成功执行。右花括号标志着main函数体的结束。
| 回书目 上一节 下一节 |
|
· 上周真题冲刺测试获奖.. · 全国计算机等考四级模.. · 08年3月各大网上书店及.. · 网络工程师模拟测试获.. · 全国计算机软考考试指.. · 3月24日WCF聊天活动 积.. |
· 全国计算机等级考试四.. · 软件项目估计:第2版 · 系统分析师基础知识自.. · 构建可扩展的Web站点的.. · 2008年全国计算机等级.. · 网络数据安全与保密自.. |
|
||||
| · 北漂技术人90天求职纪实 · 2007年互联网大会 · 龙芯要做中国的“奔腾” · IPv6协议--拓展网络无.. · 国际文档格式标准开战 · 微软出价446亿美元收购.. · 贝恩资本携手华为22亿.. · Linux——从菜鸟到高手 |
· SOA 面向服务架构 · 2008年4月全国计算机等.. · 微软Forefront企业安全.. · 华为员工自杀频频拷问.. · 技术人求职简历完备手册 · 勇闯IT培训黑色围城 · 隐私保护技术探讨 · Windows Server 2008专.. |
|||
|
||||
| · SQL Server 2008/2005.. · SOA 面向服务架构 · SQL Server 2008/2005.. · iSCSI应用与发展 · RAID——磁盘阵列基础 · 中间件应用技术专题 · SQL Server入门到精通 · 病毒查杀专题 |
· 国际文档格式标准开战 · 路由器设置与口令恢复 · Linux防火墙 · 打造安全服务器 · SOA 面向服务架构 · PHP开发应用手册 · ADSL应用面面俱到 · 入侵防护系统(IPS)初探 |
|||
|
||||
| · iSCSI应用与发展 · 中间件应用技术专题 · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · iSCSI应用与发展 · RAID——磁盘阵列基础 · 病毒查杀专题 |
· 路由器设置与口令恢复 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · ADSL应用面面俱到 · ADSL应用面面俱到 · 反垃圾邮件技术应用 · PHP开发应用手册 · 中间件应用技术专题 |
|||