第3章分解Hello World——最简单C程序组成

上传人:小**** 文档编号:243125652 上传时间:2024-09-16 格式:PPT 页数:22 大小:149KB
返回 下载 相关 举报
第3章分解Hello World——最简单C程序组成_第1页
第1页 / 共22页
第3章分解Hello World——最简单C程序组成_第2页
第2页 / 共22页
第3章分解Hello World——最简单C程序组成_第3页
第3页 / 共22页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第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,src,22 2-,helloworl,.c:5 missing prototype for print_format,Error :,cbook,src,22.2helloworldc 5 undefined reference to _print_format,编译和连接 耗时 : 3.3秒 返回代码 : 1,“,Warning h ,cbook,src,22 2-,helloworl,.c:5 missing prototype for print_format”,这句话表明,丢失了,print_format,的函数原型。仅仅是一个警告。“,Error :,cbook,src,22.2helloworldc 5 undefined reference to _print_format”,这句话表明,出现一个错误,调用了一个没有定义的函数,print_format。,3.5.2,试验寻找#,include,的作用,中,函数,printf,的声明在哪里呢?请读者再做一个试验:将中的第一行代码删除掉。就是去掉了“#,include ”,,再编译看出现什么现象。整个文件代码如下:,void main(void)/*,主函数,入口点*/,/*函数开始*/,printf,(,nHello,World!);/*,打印字符串*/,getchar,();/*,等待用户敲入回车*/,是不是编译器又提示缺少函数原型:,Warning h:,cbook,src,22.2-,helloworld,.c: 3 missing prototype for,printf,Warning h:,cbook,src,22.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,语言中,操作或者动作被称为表达式。以分号结尾的表达式称为表达式语句。例如以下示例都是表达式语句:,int,x;,printf,(,nHello,World);,(2)C,语言还有9中流程控制语句,如,if-else,for,循环语句,,while,循环语句,,do-while,循环语句,,continue,结束本次循环语句,,break,跳出循环语句,,switch,多路分支选择语句,,goto,转向语句,,return,返回语句。,(3)函数调用构成函数调用语句。,(4)只有一个“;”的空语句。,(5)复合语句。用“”包括起来的语句。,3.10 向好程序员看齐代码风格,所谓代码风格,是编写代码时对代码的编辑时的排版布局,如何命名代码中变量名称,函数名称等等。,一个优秀的程序员,除了代码质量高,错误少外,另一个非常重要的标准就是代码风格。在很多时候,代码风格比程序的效率更加重要,代码风格的好坏可以直接看出一个程序员编程的素质。优秀的代码风格如同一身得体的打扮,能够给人以良好的印象。初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格。代码风格是一个很个性化的东西,每个程序员都会有自己的喜好和见解。,3.11 小结,本章描述了,C,语言程序的大概组成。,C,语言由语句构成。每个,C,程序必须有一个,main,函数。在,main,函数中调用其他函数。可以是用户自己定义的函数,也可以是,C,语言提供的库函数,还可以是第三方提供的函数。,自定义函数要用到变量,变量存储在内存中。每个变量有自己的类型。,在源代码中,可以指示编译器的某些编译动作,也可以指示链接器如何链接。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!