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

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


相关文章:
c语言习题及答案 爱课程mooc
c语言习题及答案 爱课程mooc_理学_高等教育_教育专区。c语言习题及答案答案仅供参考 第一章 1.1 题目内容:使用 printf()在屏幕上输出 hello world! 提示: #...
C语言程序设计—北京理工大学MOOC提交作业 (1)
C语言程序设计—北京理工大学MOOC提交作业 (1)_工...第一周作业 【练习 1】HelloWorld 成绩 折扣 允许...最简单的程序,亦通常是初学者所编 写的第一个程序...
Makefile下编写Helloworld的例子
Makefile下编写Helloworld的例子_理学_高等教育_教育专区。用Makefile 简单编写 ...更新版本 hello.c 程序 #include &lt;stdio.h&gt; int main() { printf(&quot;Hello,...
Java和C语言的对比_图文
然后这里的是很简单的对比 学习,全部都是自己所理解的东西,而且都是很基础的,...程序 C 语言 Java 1.新建一个项目 2.新建一个类 3.运行 Helloworld 程序(...
用java调用C或C++动态链接库原来如此简单
使用 Java 的 JNI 调用 C/C++的动态联结库有个固定的步骤,下面将以 一个最简单HelloWorld 例子程序来说明调用过程.这个 HelloWorld 的例 子只是简单的显示 ...
C语言-01愉快的开始-hello world
32 位系统区别 1.12.1 CPU 内部结构与寄存器 1.12.2 RISC 与 CISC CPU 构架...从C语言实战谈编程:hel... 4页 免费 第3章 分解Hello World... 22页 1...
6个变态的C语言Hello World程序
main (m++):exit(n++);} hello5.c 1 2 3 4 5 6 7 8 9 10 11 ...程序12-6:16×2液晶屏系... 2页 1下载券 分解Hello World——最简.....
编程习题
4.假设下列程序保存在test.c 中,编译后运行test hello world,则输出是 ( #include&lt;stdio.h&gt; int main(int argc, char *argv[ ]) { printf(“%d,%s”, ...
java选择题
单选题 1、Java 属于以下哪种语言?() A、机器语言 B、汇编语言 C、高级语言...A、java HelloWorld B、java HelloWorld.java C、javac HelloWorld D、javac...
C语言 VS2015新建C语言工程
台应用程序② 在名称处 输入“HelloWorld”③ 点击确定 3.选择下一步 4.① 选择“空项目”② 点击“完成 5.添加 C 文件① 展开 在解决方案&quot;HelloWorld&quot;② ...
更多相关标签: