当前位置:首页 >> 英语 >>

分解HelloWorld——最简单C程序组成_图文

第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\2\2 2-helloworl.c:5 missing prototype for print_format Error :\cbook \src\2\2.2helloworldc 5 undefined reference to _print_format 编译和连接 1 耗时 : 3.3秒 返回代码 :

?

?

“Warning h \cbook \src\2\2 2-helloworl.c:5 missing prototype for print_format” 这 句 话 表 明 , 丢 失 了 print_format 的函数原型。仅仅是一个警告。“ Error :\cbook \src\2\2.2helloworldc 5 undefined reference to _print_format”这句话表明,出现一个错误,调用了一个没有定 义的函数 print_format。

3.5.2 试验寻找#include的作用
?

? ? ? ? ? ? ? ? ? ? ? ?
? ? ?

中,函数 printf的声明在哪里呢?请读者再做一个试验:将中的第一行代码删除掉。就是去掉了 “#include <stdio.h>”,再编译看出现什么现象。整个文件代码如下: void main(void) /*主函数,入口点*/ { /*函数开始*/ printf("\nHello World!"); /*打印字符串*/ getchar(); /*等待用户敲入回车*/ } 是不是编译器又提示缺少函数原型: Warning h:\cbook\src\2\2.2-helloworld.c: 3 missing prototype for printf Warning h:\cbook\src\2\2.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 计算1+1——有些小作为的程序
? ? ? ? ? ? ? ? 打印Hello World的程序非常简单,则实现了小功能,计算1+1的值: 代码- 计算1+1并打印结果Calc <-------------------------------------------------- 文件名: Calc.c------------------------------------------------------> #include <stdio.h> void main(void) { int a,b; b为整型变量*/ int y; /*声明y 为整型变量 */ a=1; a赋值为1,此时a的值为1*/ b=1; b赋值为1,此时b的值为1*/ y=a+b; 的值分别取出来,计算结果后,赋值给变量y*/ printf("\na+b=%d",y); getchar(); } 编译后运行,程序结果如下: a+b=2

/* 声 明 a ,

? ? ? ? ? ? ? ?

/* 给变量 /* 给变量 /* 将a 、 b /*把y的值打印出来*/

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 ? <----------------------------------------------- 文 件 名 : Average.c --------------------------------------------------> ? #include <stdio.h> ? ? ? ? ? ? ? ? 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 <-----------------------------------------------文件名:Average2.c --------------------------------------------------> #include <stdio.h>

? ? ? ? ? ? ? ? ? ? ? ?

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语言提供的库函数,还可以是第三方提 供的函数。 ? 自定义函数要用到变量,变量存储在内存中。每 个变量有自己的类型。 ? 在源代码中,可以指示编译器的某些编译动作, 也可以指示链接器如何链接。


相关文章:
分解HelloWorld最简单C程序组成_图文.ppt
分解HelloWorld最简单C程序组成 - 第3章 分解Hello World最简单C程序组成 ? 在第2章读者随着笔者照葫芦画瓢,创建了第一个 可运行的程序。相信读者对着...
第3章 分解Hello World最简单C程序组成_图文.ppt
第3章 分解Hello World最简单C程序组成_医学_高等教育_教育专区。第3章 分解Hello World最简单C程序组成 ? 在第2章读者随着笔者照葫芦画瓢,创建了第...
HelloWorld最简单C程序组成课件资料_图文.ppt
HelloWorld最简单C程序组成课件资料 - 第3章 分解Hello World最简单C程序组成 ? 在第2章读者随着笔者照葫芦画瓢,创建了第一个 可运行的程序。相信读者...
最简单的C程序(STM32版的helloworld).pdf
最简单C程序(STM32版的helloworld) - 最简单C 程序( STM32 版的 helloworld) 下面开始讨论如何在 STM32 上写一个最简单的程序,会谈到程序执行的细...
项目一:初识一个简单的C程序Hello World!_图文.ppt
因此,这两个函数 在括号中的参数表都由以下两部分组成: “格式控制串”,参数...分解Hello World最简... 暂无评价 22页 2下载券 6个变态的C语言Hello...
一个简单的C程序_图文.ppt
一个简单C程序 #include <stdio.h> void main() { printf(“hello,world”); } 本程序的输入结果是:hello,world 解读该程序: main()是函数的名字,表示...
第一章 C语言程序的结构_图文.ppt
C源程序由函数组成 ? 程序由一个或多个函数组成,函数是C程序的 基本单位。 ...“Hello,World!\n”); } 注释 /*example1.2 例 整数求和 calculate the ...
C语言程序的组成部分_图文.ppt
第2章 C语言程序组成 部分 徐秋红 办公地点:主楼西配楼(信息学院)310室 ...(" \rHello world: %d",i); } system("Pause"); return 0; } 41 ...
C语言-01-编写简单的C语言程序_图文.ppt
编写简单C语言程序 概述---程序和程序设计过程一.程序的概念程序就是一系列的...printf("hello,world"); 是一条语 句,该语句用以在屏幕输出 hello,world这些...
C_01 hello world_图文.ppt
函数就是组成C语言程序的一个一个的功能模 块,就像房子是由一块块砖头搭建...2-QT(Hello World程序) 20页 1下载券 第3章 分解Hello World... 19页 ...
最简单的C程序设计_图文.ppt
最简单C程序设计_计算机软件及应用_IT/计算机_专业资料。简单的C程序设计夏涛...? 在屏幕输出:Hello World! 有两个int型变量a和b,请输出它们的值。 有两个...
第四章 最简单的C程序设计-顺序程序设计_图文.ppt
第四章 最简单C程序设计-顺序程序设计_计算机软件及应用_IT/计算机_专业资料...( ); printf(“Hello,world!\n”); {z=x+y; t=z/100; } 4.2赋值...
第四章 最简单的C程序设计-顺序程序设计-PPT精品文档_图文.ppt
第四章 最简单C程序设计-顺序程序设计-PPT精品文档_计算机软件及应用_IT/...( ); printf(“Hello,world!\n”); {z=x+y; t=z/100; } 4.2赋值...
第1章 简单的C语言程序设计_图文.ppt
1.4 简单C语言程序输出: Hello,World! 例1.1 第一个程序 Hello,World! /...函数与主函数 程序由一个或多个函数组成 必须有且只能有一个主函数main...
C语言 最简单的C程序设计_图文.ppt
?所有的C语言程序都包含一个或多个 函数 ?main并不是C语言组成部分,但 ...? 在屏幕输出:Hello World! 有两个int型变量a和b,请输出它们的值。 有两个...
C语言第一节课HELLO WORLD_图文.pdf
C语言第一节课HELLO WORLD_电子/电路_工程科技_专业资料。C 语言课堂任务标准 1 (第一周上机操作部分: 一、熟悉机房环境★★★ 1.能够开机进入到软件频道。 2...
最简单的C程序设计顺序程序设计2012_图文.ppt
?C语句分类 ?表达式语句:表达式加分号构成。 分支 如 total=total+limit; ?空语句: ; a=3; ?程序控制语句 (9种): func( ); 循环 printf(“Hello,world!...
传智播客C语言入门2-环境搭建及helloworld_图文.ppt
C语言课程概述传智播客C语言入门教程(2)大纲 1.C语言开发环境概述 2.安装VisualStudio2010 3.VisualStudio开发环境概述 4.跟我一起实现Hello World 5.C语言编译...
DS-5创建一个以裸机为目标的简单 Hello World C 程序.doc
创建一个以裸机为目标的简单 Hello World C 程序在安装并获取使用 DS-5 所需的许可证后,本教程将指导您创建、配置并 生成简单的裸机应用程序。 应用程序生成后...
第1讲 简介与hello world_图文.ppt
用助记符表示指令 机器语言 由0、1序列构成的指令码 11 二、程序设计过程(...12 三、最简单C程序(重点) 例1-3: 上机实现在屏幕上输出字符序列Hello,World...