分解HelloWorld——最简单C程序组成.ppt_第1页
分解HelloWorld——最简单C程序组成.ppt_第2页
分解HelloWorld——最简单C程序组成.ppt_第3页
分解HelloWorld——最简单C程序组成.ppt_第4页
分解HelloWorld——最简单C程序组成.ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章 分解Hello World最简单C程序组成,在第2章读者随着笔者照葫芦画瓢,创建了第一个可运行的程序。相信读者对着源代码一头雾水不知所以,所以本章解释第2章的Hello World源代码,先回顾第2章的源代码,如所示。,3.1 C程序概貌,很短,简单几行文字,就创建了一个可以运行的程序,非常神奇。代码虽小,但五脏俱全,综观整个代码,可以总结如下特点: (1)由单词,符号,空白组成。单词以英语单词为主,有的单词就是纯正的英语单词,如main、void、include;有的不是,如getchar、pringf。单词一般都小写。代码中的标点符号并不是随意输入的。每个符号在C中都有自己的含义。中出现的符号,有“#”、“”、“()”、“”、“/*”、“*/”、“”、“;”、“”。单词与单词之间用空白分隔,空白可以是空格,也可以是Tab制表符。空白的个数没有限制。 (2)如同阅读小说一样,C源代码也是从上往下阅读。也就是C源代码的先后顺序是有讲究的。行与行之间也可以有空白行。空白行数也是没有限制的。有的行顶格书写,有的行却又后退了几个空格,这种后退,称为“缩进”。如何缩进,这些也都是有讲究的。 (3)并没有专门的标志表示文件从哪里起始,也没有标志表示文件到哪里结束。从第一个字符开始,文件就开始了,到最后一个字符结束,文件就结束了。,3.2 为何有必要在代码里留下程序员的解释注释,出现最多的是“/*”和“*/”包裹起来的中文语句,这些是注释。注释是帮助程序员阅读源代码和理解源代码的。编译器在编译源代码的时候,在目标代码生成以前,会把注释剔除掉然后再进行编译,当然编译器是不会修改源文件的,这一切是在内存中完成。由于对于注释部分忽略不处理,就如同没有这些字符一样,所以注释不会增加编译后的程序的可执行代码长度,对程序运行不起任何作用。,3.3 从哪里开始,到哪里结束main函数,先看下面的代码段,这段代码是从中截取过来的,为了学习方便,去掉了注释部分: void main(void) printf(“nHello World!“); getchar(); void main(void) 这一段是在定义C程序的主函数。函数是可以完成一定功能的子程序。Main函数是C语言程序的起始执行点。每一个C程序必须有且仅有一个main函数,它是由程序员提供的。,3.4 如何在屏幕上显示文字函数调用,Main函数体中: printf(“nHello World!“); 这行是调用了C语言提供的打印数输出函数,该函数的名字是“printf”,小括号内双引号括起来的文字是printf函数的参数。该函数的功能是把小括号里的文字原样打印在屏幕上。也就是说双引号里的内容变化,则打印在屏幕上的文字也会变化。请读者自己试验修改双引号里的文字。 说明:“n”在这里有特殊的含义,读者可以发现“n”并没有在屏幕中打印出来。“n”中的“”是转义字符,表示其后面紧跟的字符有专门的意思。“n”表示将光标移到第二行第一格。也就是回车换行的意思。,3.5 编译器如何认识printf函数#include预处理器指示符,源代码最终是需要被编译器处理的。编译器编译的过程比较复杂,但一般需要经历好几步。第一步是预处理。所谓预处理,就是编译前,先进行些预先处理,如代替源代码中需要代替的部分。#include就是这么一个预处理指示指令。 为了弄清楚#include的作用,现在请读者思考一个问题:编译器如何知道有printf这个函数?,3.5.1 函数声明及其作用,上节中留给读者的试验,修改printf为其他单词,如print_format,则在编译的时候,编译器会返回错误: Warning h cbook src22 2-helloworl.c:5 missing prototype for print_format Error :cbook src22.2helloworldc 5 undefined reference to _print_format 编译和连接 耗时 : 3.3秒 返回代码 : 1 “Warning h cbook src22 2-helloworl.c:5 missing prototype for print_format”这句话表明,丢失了print_format的函数原型。仅仅是一个警告。“Error :cbook src22.2helloworldc 5 undefined reference to _print_format”这句话表明,出现一个错误,调用了一个没有定义的函数 print_format。,3.5.2 试验寻找#include的作用,中,函数printf的声明在哪里呢?请读者再做一个试验:将中的第一行代码删除掉。就是去掉了“#include ”,再编译看出现什么现象。整个文件代码如下: void main(void) /*主函数,入口点*/ /*函数开始*/ printf(“nHello World!“); /*打印字符串*/ getchar(); /*等待用户敲入回车*/ 是不是编译器又提示缺少函数原型: Warning h:cbooksrc22.2-helloworld.c: 3 missing prototype for printf Warning h:cbooksrc22.2-helloworld.c: 4 missing prototype for getchar 编译和连接 耗时:0.3秒 返回代码:0 3.5.3 #include的作用 现在让笔者来解释#include这行代码的作用。 #include是C语言预处理器指示符。#和include之间可以有多个空格。#也不一定要顶格,但是一定是第一个非空白字符。#include的作用,是告诉编译器在编译前,要做些预先处理:将后面中的文件内容包含到当前文件内。所谓包含,是指将中列出的文件的内容复制到当前文件里。 注意:#一定要是第一个非空白字符。否则编译器会提示错误,并且错误信息和出错原因完全不匹配。 因为getchar和printf两个函数的声明位于stdio.h文件中,所以简单的用#include把stdio.h文件包含进来,自然就把getchar和printf两个函数的声明包含进来了。 说明:函数声明只是向编译器登记有这么一个函数,声明了函数不调用这个函数,是被容许的。这就是为什么包含了整个stdio.h文件,里面声明了很多其他函数,但实际没有使用这些函数而编译器又不提示的原因。,3.6 计算有些小作为的程序,打印Hello World的程序非常简单,则实现了小功能,计算1+1的值: 代码 计算1+1并打印结果Calc #include void main(void) int a,b; /*声明a,b为整型变量*/ int y; /*声明y 为整型变量 */ a=1; /*给变量a赋值为1,此时a的值为1*/ b=1; /*给变量b赋值为1,此时b的值为1*/ y=a+b; /*将a、b的值分别取出来,计算结果后,赋值给变量y*/ printf(“na+b=%d“,y); /*把y的值打印出来*/ getchar(); 编译后运行,程序结果如下: a+b=2,3.7 数据从哪里来,又到哪里去变量,在计算机程序设计中,经常要用到变量。比如在屏幕中移动光标,需要存储光标的x,y坐标,每次移动光标,就需要对坐标修改,也就是x,y的值要改变;为了得到当前光标的坐标,就需要从x,y中得到当前的值,这些,在程序设计中,就是通过变量来完成。,3.7.1 变量在内存中的表现形式,变量是指其值可以变化的量。计算机中,指令代码、数据都存储于内存中。变量也需要存储在内存中。 类比人类的思维过程,也很容易明白为什么需要内存空间存储变量:假设现在有三个数据,分别是a=3,b=4,c=5,需要读者去计算“a+b+c”的值。读者首先回忆a的值是3,b的值是4,c的值是5,然后分别用3,4,5作为计算的数得到“3+4+5=12”。这是一个很简单的过程,思考过程几乎不花费时间。如果计算的变量超过100个,估计大部分读者都记不住这么多数据的值,需要把这些数据及其对应的数值记录在纸上或其地方,当需要用到某个数据的时候,再去查看其对应的值。计算机中的变量类似。 在计算机中,每个变量都被分配了一块内存空间,在这些空间里存储的就是变量的值。变量之所以可以变化,就是这个存储空间可以存储不同的数值。存储空间里的值变化,则变量对应的值也变化。同一个时间,内存空间里只能保存一份值,新值冲掉了原来的旧值。每个内存单元都有编号,这些是内存的地址。如所示,3.7.2 编译器使用变量符号表,在源代码中,为了程序员阅读,每个变量都有变量名。实际上编译后的目标代码里,并没有变量名字,而是记录着变量在内存空间中的地址。变量的名字只是方便程序员阅读才设置的。在C语言中,为了方便,通过变量名就可以访问到变量的值,对变量名的访问,就是对变量的值的访问。 在编译的过程中,编译器会建立一张变量符号表,该表记录的数据是:变量类型、变量名、变量地址等信息。 如上中,编译器会建立变量符号表如所示。,3.7.3 变量及使用,变量有不同的类型,如记录英文字母及标点符号,就需要字符类型(char)的变量;记录整数需要整数类型int的变量;记录实数有float类型的变量。这些变量都是数值类型,C语言还提供其他类型的变量,详细课程参见后续章节的论述。 通过上述简单叙述,读者可以对变量有了一个大概的感性认识了。再回过头来看看源代码中每行的意思。 (1)int a,b;这是向编译器声明,以下程序将会用到两个整型变量,其名字为a和b。此时并不会进行真正的内存分配动作,也就是此时并没有内存地址与变量名关联。 (2)int y;同样是向编译器声明,一下程序会用到整型变量y。变量可以一行声明多个,也可以一行声明一个,多个变量分多次声明,意义都一样。 (3)a=1;这是给a赋值。请读者注意等号“=”,“=”是C语言提供的运算符。在C语言里的“=”不同于数学里的等号“=”。数学中的等号是说“=”两边相等,左右等价,可以交换。计算机中的“=”是赋值符号,有一个运算顺序,是先计算“=”右边的表达式的值,然后把数值赋给左边。左右不能交换。所谓赋值,就是把运算所得的数值存储在内存中。 (4)b=1;同样的编译分配内存空间给变量b,地址为2004,然后将数值1存储在2004对应的内存空间里。 (5)y=a+b;这里的“+”,也是C语言提供的运算符。同数学里的四则运算中的“+”一样,进行加法运算。 (6)printf(“na+b=%d“,y);把y的值打印出来。这里同样要访问变量y去获取其值。过程同上。,3.8 自己设计C函数,用C语言库函数和第三方提供的函数组装程序是程序设计的一条捷径和重要方法。但是,一个C程序不可能只由一个main函数组成,在main函数中实现所有的功能。编写程序,更多的时候需要程序员自己动手创建新的函数。,3.8.1 在main函数中计算3个整数的平均数,先请看: 代码 在main中计算3个整数的平均数Average #include void main(void) int a=1,b=2,c=3; int y = (a+b+c) / 3; printf(“n the average is %d“,y); 编译运行,程序输出为: the average is 2,3.8.2 在main函数中分3次计算3个整数的平均数,如果需求变化为先计算1,2,3这三个整数的平均值后,再计算1234,2345,3456这三个整数的平均值,最后计算9876,2345,1这三个整数的平均值呢?方法一如所示。 代码 分3次计算3个整数的平均值Average2 #include void main(void) int a=1,b=2,c=3; int a2=1234,b2=2345,c2=3456; int a3=9876,b3=2345,c3=1; int y = (a+b+c) / 3; int y2= (a2+b2+c2) /3; int y3= (a3+b3+c3) /3; printf(“n the average is %d“,y); printf(“n the average is %d“,y2); printf(“n the average is %d“,y3); ,3.8.3 自编函数实现计算3个整数的平均数,请读者将目光关注以下3行代码上: int y = (a+b+c) / 3; int y2= (a2+b2+c2) /3; int y3= (a3+b3+c3) /3; 这3行代码将求平均值的公式使用了3次。重复的代码将使得以后的代码维护困难,因为一个地方修改,其他重复的地方也要修改。这3行代码功能相同,虽然很简单,但是可以将其抽取出来,形成一个函数。具体代码如所示。,3.8.4 如何自编写函数,对有以下说明: (1)int average(int a,int b,int c);函数声明。声明是向编译器登记有这么一个函数,其函数原型如声明中所示。average函数的原型告诉编译器: (2)函数声明后,就可以调用该函数了。如同上文所述,编译器知道有某个函数的原型后,即认为该函数可以调用。 (3)函数定义部分。以下部分就是函数定义。 int average(int a,int b,int c) return (a+b+c)/3; (4)return是C语言提供的关键字。从函数调用中返回。并向调用者返回其后带动表达式的值。,3.8.5 试验观察总结函数声明和函数定义的意义,请读者做试验,查看的编译链接结果:,3.9 语句构成程序,C语言有5种类型的语句,如下: (1)表达式语句。C语言中,操作或者动作被称为表达式。以分号结尾的表达式称为表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论