[ 更换 ]
热门城市
北京上海广州深圳成都杭州南京武汉天津西安重庆青岛沈阳长沙大连厦门无锡福州济南宁波昆明苏州郑州长春合肥南昌哈尔滨常州烟台南宁温州石家庄太原珠海南通扬州贵阳东莞徐州大庆佛山威海洛阳淮安呼和浩特镇江潍坊桂林中山临沂咸阳包头嘉兴惠州泉州三亚赣州九江金华泰安榆林许昌新乡舟山慈溪南阳聊城海口东营淄博漳州保定沧州丹东宜兴绍兴唐山湖州揭阳江阴营口衡阳郴州鄂尔多斯泰州义乌汕头宜昌大同鞍山湘潭盐城马鞍山襄樊长治日照常熟安庆吉林乌鲁木齐兰州秦皇岛肇庆西宁介休滨州台州廊坊邢台株洲德阳绵阳双流平顶山龙岩银川芜湖晋江连云港张家港锦州岳阳长沙县济宁邯郸江门齐齐哈尔昆山柳州绍兴县运城齐河衢州太仓张家口湛江眉山常德盘锦枣庄资阳宜宾赤峰余姚清远蚌埠宁德德州宝鸡牡丹江阜阳莆田诸暨黄石吉安延安拉萨海宁通辽黄山长乐安阳增城桐乡上虞辽阳遵义韶关泸州南平滁州温岭南充景德镇抚顺乌海荆门阳江曲靖邵阳宿迁荆州焦作丹阳丽水延吉茂名梅州渭南葫芦岛娄底滕州上饶富阳内江三明淮南孝感溧阳乐山临汾攀枝花阳泉长葛汉中四平六盘水安顺新余晋城自贡三门峡本溪防城港铁岭随州广安广元天水遂宁萍乡西双版纳绥化鹤壁湘西松原阜新酒泉张家界黔西南保山昭通河池来宾玉溪梧州鹰潭钦州云浮佳木斯克拉玛依呼伦贝尔贺州通化朝阳百色毕节贵港丽江安康德宏朔州伊犁文山楚雄嘉峪关凉山雅安西藏四川广东河北山西辽宁黑龙江江苏浙江安徽福建江西山东河南湖北湖南海南贵州云南陕西甘肃青海台湾内蒙古广西宁夏香港澳门
培训资讯网 - 为兴趣爱好者提供专业的职业培训资讯知识

专为新手打造的C语言入门,手把手教你编写一个简单的C程序

手把手 把手 新手 语言

专为新手打造的C语言入门,手把手教你编写一个简单的C程序

第 2 章 C语言基本概念

某个人的常量可能是其他人的变量。

本章介绍了C语言的一些基本概念,包括预处理指令、函数、变量和语句。即使是编写最简单的C程序,也会用到这些基本概念。后续几章会更详细地描述这些概念。

首先,2.1节给出一个简单的C程序,并且描述了如何对这个程序进行编译和链接。接着,2.2节讨论如何使程序通用。2.3节介绍如何添加说明性解释,即通常所说的注释。2.4节介绍变量,变量用来存储程序执行过程中可能发生改变的数据。2.5节说明利用scanf函数把数据读入变量的方法。就如2.6节介绍的那样,常量是程序执行过程中不会发生改变的数据,用户可以对其进行命名。最后,2.7节解释C语言的命名(标识符)规则,2.8节给出C程序的布局规范。

2.1 编写一个简单的C程序

与用其他语言编写的程序相比,C程序较少要求“形式化的东西”。一个完整的C程序可以只有寥寥数行。

程序 显示双关语

在Kernighan和Ritchie编写的经典C语言著作《C程序设计语言》中,第一个程序是极其简短的。它仅仅输出了一条hello, world消息。与大多数C语言书的作者不同,我不打算用这个程序作为第一个C程序示例,而更愿意尊重C语言的另一个传统:显示双关语。下面是一条双关语:

To C, or not to C: that is the question.

下面这个名为pun.c的程序会在每次运行时显示上述消息。

pun.c

#include <stdio.h> int main(void) { printf("To C, or not to C: that is the question.\n"); return 0; }

2.2节会对这段程序中的一些格式进行详尽的说明,这里仅做简要介绍。对本程序所要完成的操作来说,它的第一行

#include <stdio.h>

是必不可少的,它“包含”了C语言标准输入/输出库的相关信息。程序的可执行代码都在main函数中,这个函数代表“主”程序。main函数中的第一行代码是用来显示期望信息的。printf函数来自标准输入/输出库,可以产生完美的格式化输出。代码\n告诉printf函数执行完消息显示后要进行换行操作。第二行代码

return 0;

表明程序终止时会向操作系统返回值0。

2.1.1 编译和链接

尽管pun.c程序十分简短,但是为运行这个程序而包含的内容可能比想象的要多。首先,需要生成一个含有上述程序代码的名为pun.c的文件(使用任何文本编辑器都可以创建该文件)。文件的名字无关紧要,但是编译器通常要求带上文件的扩展名.c。

接下来需要把程序转化为机器可以执行的形式。对于C程序来说,转化通常包含下列3个步骤。

  • 预处理。首先程序会被交给预处理器(preprocessor)。预处理器执行以#开头的命令(通常称为指令)。预处理器有点类似于编辑器,它可以给程序添加内容,也可以修改程序。
  • 编译。修改后的程序现在可以进入编译器(compiler)了。编译器会把程序翻译成机器指令(即目标代码)。然而,这样的程序还是不可以运行的。
  • 链接。在最后一个步骤中,链接器(linker)把由编译器产生的目标代码和所需的其他附加代码整合在一起,这样才最终产生了完全可执行的程序。这些附加代码包括程序中用到的库函数(如printf函数)。

幸运的是,上述过程往往是自动实现的,因此人们会发现这项工作不是太艰巨。事实上,因为预处理器通常会和编译器集成在一起,所以人们甚至可能不会注意到它在工作。

根据不同的编译器和操作系统,编译和链接所需的命令也是多种多样的。在UNIX系统环境下,通常把C编译器命名为cc。为了编译和链接pun.c程序,需要在终端或命令行窗口输入如下命令:

% cc pun.c

(字符%是UNIX系统的提示符,不需要输入。)在使用编译器cc时,系统自动进行链接操作,无须单独的链接命令。

在编译和链接好程序后,编译器cc会把可执行程序放到默认名为a.out的文件中。编译器cc有许多选项,其中一个选项(-o)允许为含有可执行程序的文件选择名字。例如,假设要把文件pun.c生成的可执行文件命名为pun,那么只需输入下列命令:

% cc –o pun pun.c

GCC

GCC是最流行的C编译器之一,它随Linux发行,但也有面向其他很多平台的版本。这种编译器的使用与传统的UNIX cc编译器相似。例如,编译程序pun.c可以使用以下命令:

% gcc –o pun pun.c

专为新手打造的C语言入门,手把手教你编写一个简单的C程序 本章最后的“问与答”部分将提供更多关于GCC的信息。

2.1.2 集成开发环境

到目前为止,我们一直通过在操作系统提供的特殊窗口中输入命令的方式来调用“命令行”编译器。事实上,还可以使用集成开发环境(integrated development environment, IDE)来编译。集成开发环境是一个软件包,我们可以在其中编辑、编译、链接、执行甚至调试程序。组成集成开发环境的各个部分可以协调工作。例如,当编译器发现程序中有错误时,它会让编辑器把包含出错代码的行突出显示。集成开发环境有很多种,本书不打算一一讨论它们,但我建议读者了解一下自己的平台上可以运行哪些集成开发环境。

2.2 简单程序的一般形式

下面一起来仔细研究一下pun.c程序,并且由此归纳出一些通用的程序格式。简单的C程序一般具有如下形式:

指令 int main(void) { 语句 }

在这个模板以及本书的其他类似模板中,所有以等宽(Courier)字体显示的语句都代表实际的C语言程序代码,所有以中文楷体 + 斜体显示的部分则表示需要由程序员提供的内容。

注意如何使用花括号来标出main函数的起始和结束。C语言使用{和}的方式非常类似于其他语言中begin和end的用法。专为新手打造的C语言入门,手把手教你编写一个简单的C程序 这也说明了有关C语言一个共识:C语言极其依赖缩写词和特殊符号,这是C程序非常简洁(或者不客气地说含义模糊)的一个原因。

即使是最简单的C程序也依赖3个关键的语言特性:指令(在编译前修改程序的编辑命令)、函数(被命名的可执行代码块,如main函数)和语句(程序运行时执行的命令)。下面将详细讨论这些特性。

2.2.1 指令

在编译C程序之前,预处理器会首先对其进行编辑。我们把预处理器执行的命令称为指令。第14章和第15章会详细讨论指令,这里只关注#include指令。

程序pun.c由下面这行指令开始:

#include <stdio.h>

这条指令说明,在编译前把<stdio.h>中的信息“包含”到程序中。<stdio.h>包含C标准输入/输出库的信息。C语言拥有大量类似于<stdio.h>的头(header,➤15.2节),每个头都包含一些标准库的内容。这段程序中包含<stdio.h>的原因是C语言不同于其他的编程语言,它没有内置的“读”和“写”命令。输入/输出功能由标准库中的函数实现。

所有指令都是以字符#开始的。这个字符可以把C程序中的指令和其他代码区分开来。指令默认只占一行,每条指令的结尾没有分号或其他特殊标记。

2.2.2 函数

函数类似于其他编程语言中的“过程”或“子例程”,它们是用来构建程序的构建块。事实上,C程序就是函数的集合。函数分为两大类:一类是程序员编写的函数,另一类则是作为C语言实现的一部分提供的函数。我们把后者称为库函数(library function),因为它们属于一个由编译器提供的函数“库”。

术语“函数”来源于数学。在数学中,函数是指根据一个或多个给定参数进行数值计算的规则:

C语言对“函数”这个术语的使用则更加宽松。在C语言中,函数仅仅是一系列组合在一起并且被赋予了名字的语句。某些函数计算数值,某些函数则不是这样。计算数值的函数用return语句来指定所“返回”的值。例如,对参数进行加1操作的函数可以执行语句

return x + 1;

而当函数要计算参数的平方差时,则可以执行语句

return y * y – z * z;

虽然一个C程序可以包含多个函数,但只有main函数是必须有的。main函数是非常特殊的:在执行程序时系统会自动调用main函数。在第9章,我们将学习如何编写其他函数,在此之前的所有程序都只包含一个main函数。

专为新手打造的C语言入门,手把手教你编写一个简单的C程序 main函数的名字是至关重要的,绝对不能改写成begin或者start,甚至写成MAIN也不行。

如果main是一个函数,那么它会返回一个值吗?是的。它会在程序终止时向操作系统返回一个状态码。我们再来看看pun.c程序:

#include <stdio.h> int main(void) { printf("To C, or not to C: that is the question.\n"); return 0; }

main前面的int表明该函数将返回一个整数值。圆括号中的void表明main函数没有参数。语句

return 0;

有两个作用:一是使main函数终止(从而结束程序),二是指出main函数的返回值是0。后面还将详细论述main函数的返回值(➤9.5节)。专为新手打造的C语言入门,手把手教你编写一个简单的C程序 但是现在我们始终让main函数的返回值为0,这个值表明程序正常终止。

专为新手打造的C语言入门,手把手教你编写一个简单的C程序 如果main函数的末尾没有return语句,程序仍然能终止。但是,许多编译器会产生一条警告信息(因为函数应该返回一个整数,却没有这么做)。

2.2.3 语句

语句是程序运行时执行的命令。本书后面的几章(主要集中在第5章和第6章)将进一步探讨语句。程序pun.c只用到两种语句:一种是返回(return)语句,另一种是函数调用(function call)语句。要求某个函数执行分派给它的任务称为调用这个函数。例如,程序pun.c为了在屏幕上显示一条字符串就调用了printf函数:

printf("To C, or not to C: that is the question.\n");

C语言规定每条语句都要以分号结尾。[就像任何好的规则一样,这条规则也有一个例外:后面会遇到的复合语句(➤5.2节)就不以分号结尾。]由于语句可以连续占用多行,有时很难确定它的结束位置,因此用分号来向编译器显示语句的结束位置。但指令通常只占一行,因此不需要用分号结尾。

2.2.4 显示字符串

printf是一个功能强大的函数,第3章会进一步介绍。到目前为止,我们只是用printf函数显示了一条字面串(string literal)——用一对双引号包围的一系列字符。当用printf函数显示字面串时,最外层的双引号不会出现。

当显示结束时,printf函数不会自动跳转到下一输出行。为了让printf跳转到下一行,必须在要显示的字符串中包含\n(换行符)。写换行符就意味着终止当前行,然后把后续的输出转到下一行。为了说明这一点,请思考把语句

printf("To C, or not to C: that is the question.\n");

替换成下面两个对printf函数的调用后所产生的效果:

printf("To C, or not to C: "); printf("that is the question.\n");

第一条printf函数的调用语句显示出To C, or not to C:,第二条调用语句显示出that is the question.并且跳转到下一行。最终的效果和前一个版本的printf语句完全一样,用户不会发现什么差异。

换行符可以在一个字面串中出现多次。为了显示下列信息:

Brevity is the soul of wit. --Shakespeare

可以这样写:

printf("Brevity is the soul of wit.\n --Shakespeare\n");

2.3 注释

我们的pun.c程序仍然缺乏某些重要内容:文档说明。每一个程序都应该包含识别信息,即程序名、编写日期、作者、程序的用途以及其他相关信息。C语言把这类信息放在注释(comment)中。符号/*标记注释的开始,符号*/标记注释的结束。例如:

/* This is a comment */

注释几乎可以出现在程序的任何位置上。它既可以独占一行,也可以和其他程序文本出现在同一行中。下面展示的程序pun.c就把注释加在了程序开始的地方:

/* Name: pun.c */ /* Purpose: Prints a bad pun. */ /* Author: K. N. King */ #include <stdio.h> int main(void) { printf("To C, or not to C: that is the question.\n"); return 0; }

注释还可以占用多行。如果遇到符号/*,那么编译器读入(并且忽略)随后的内容直到遇到符号*/为止。如果愿意,还可以把一串短注释合并成为一条长注释:

/* Name: pun.c Purpose: Prints a bad pun. Author: K. N. King */

但是,上面这样的注释可能难以阅读,因为人们阅读程序时可能不易发现注释的结束位置。因此,单独把*/符号放在一行会很有帮助:

/* Name: pun.c Purpose: Prints a bad pun. Author: K. N. King */

更好的方法是用一个“盒形”格式把注释单独标记出来:

/********************************************************** * Name: pun.c * * Purpose: Prints a bad pun. * * Author: K. N. King * **********************************************************/

有些程序员通过忽略3条边框的方法来简化盒形注释:

/* * Name: pun.c * Purpose: Prints a bad pun. * Author: K. N. King */

简短的注释还可以与程序中的其他代码放在同一行:

int main(void) /* Beginning of main program */

这类注释有时也称作“翼型注释”。

专为新手打造的C语言入门,手把手教你编写一个简单的C程序 如果忘记终止注释,则可能会导致编译器忽略程序的一部分。请思考一下下面的示例:

printf("My "); /* forgot to close this comment... printf("car "); printf("has "); /* so it ends here */ printf("fleas");

因为在第一条注释中遗漏了结束标志,所以编译器忽略了中间的两条语句,因此程序最终只打印了My fleas。

专为新手打造的C语言入门,手把手教你编写一个简单的C程序 C99提供了另一种类型的注释,以//(两个相邻的斜杠)开始:

// This is a comment

这种风格的注释会在行末自动终止。如果要创建多于一行的注释,既可以使用以前的注释风格(/* ... */),也可以在每一行的前面加上//:

// Name: pun.c // Purpose: Prints a bad pun. // Author: K. N. King

新的注释风格有两个主要优点:首先,因为注释会在行末自动终止,所以不会出现未终止的注释意外吞噬部分程序的情况;其次,因为每行注释前面都必须有//,所以多行注释看上去更加醒目。

2.4 变量和赋值

很少有程序会像2.1节中的示例那样简单。大多数程序在产生输出之前往往需要执行一系列的计算,因此需要在程序执行过程中有一种临时存储数据的方法。和大多数编程语言一样,C语言中的这类存储单元被称为变量(variable)。

2.4.1 类型

每一个变量都必须有一个类

相关内容

怎么学?如何干?西藏7市(地)委书记在西藏日报发表文章

启航新征程 开创新局面为全面建设社会主义现代化新拉萨努力奋斗自治区党委常委、拉萨市委书记 普布顿珠党的二十大大笔擘画坚持以中国式现代化全面推进中华民族伟大复兴的宏伟蓝图,区党委十届三次全会全面铺开建设美丽幸福西藏、共圆伟大复兴梦想的壮阔实践···

2023年全区智慧旅游专业人才培训班圆满结业

6月2日,自治区旅游发展厅主办的全区智慧旅游专业人才培训班在拉萨圆满结业。培训共历时三天,累计完成全区旅游行政管理部门工作人员及涉旅企业专业技术人员培训100人。本次培训是区旅发厅深入推进学习贯彻习近平新时代中国特色社会主义思想主题教育重要···

徐汇萨迦共同举办大美西藏首届口腔学习班

随着现代医学的发展,口腔健康越来越受到人们的关注,为提高西藏地区口腔技术水平和服务质量,近日,徐汇区牙病防治所和萨迦县中心医院远程连线共同举办首届口腔学习班开班仪式。徐汇区卫生健康委副主任胡强,上海援藏干部、萨迦县委常务副书记、常务副县长沈···

自觉抵制“一对一”“一对多”等学科类培训!哈尔滨中小学生暑期预警来了

17日,记者从哈尔滨市各区教育局获悉,2023年暑假将至,南岗区、道里区、香坊区教育局向家长发出预警,自觉抵制违规培训,各区义务教育阶段学科类培训机构已经全部注销,暑假期间以任何形式开展的学科类培训均属于违规培训。家长要自觉抵制任何机构或个···

哈尔滨市道里区企投局举办“招商大讲堂”专题培训

黑龙江网讯(记者 王惠婷)10月24日,哈尔滨市道里区企投局组织开展“招商大讲堂”专题培训班,全区各招商专班负责同志及业务骨干参加培训。本次培训从实际需求出发,紧紧围绕当前招商工作中的热点、难点,对“什么是招商引资”“道里区的产业结构和主导···

团黑龙江省委举办全省青年文明号青年岗位能手学习宣传贯彻党的二十大精神培训交流会

中国青年报客户端讯(李海涛)为深入学习贯彻党的二十大精神,充分发挥青年文明号、青年岗位能手示范引领作用,在全省职业青年中掀起学习党的二十大精神热潮,11月22日,团黑龙江省委举办全省青年文明号青年岗位能手学习宣传贯彻党的二十大精神培训交流会···

辽宁葫芦岛举办外贸政策培训会推动外贸保稳增量

辽宁省葫芦岛市外贸政策培训会4月3日举办。 辽宁省贸促会供图中新网葫芦岛4月3日电 (李晛)辽宁省葫芦岛市外贸政策培训会4月3日举办。本次活动由辽宁省贸促会支持、葫芦岛市商务局主办,葫芦岛市贸促会、葫芦岛海关、中国出口信用保险辽宁分公司和辽···

山西运城:严查无证校外培训机构 查封9家警告2家

新华社太原8月5日电(记者王飞航)记者从山西省运城市政府了解到,运城市教育局近日联合市公安局等多家单位,对中心城区无证校外培训机构进行了一次突击检查,共检查了13家校外培训机构,查封9家,警告2家,发放整改通知书4份。今年7月,运城市教育局···

山西开展培训筑牢森林“防火墙”

山西新闻网3月30日讯(记者 卢奕如)今日,记者从山西省应急管理厅获悉,全省举办森林草原防灭火业务培训,邀请专家以视频会议形式,围绕森林扑火指挥实操、森林草原火灾防控经验做法、火灾现场各级各类指挥员具体操作中遇到的问题等内容进行授课。培训内···

校外培训机构治理工作取得进展 山西停办近1300所

资料图:小学生排队等待进入校园。中新社记者 刘文华 摄中新网5月11日电 据教育部网站消息,按照校外培训机构专项治理工作整体安排,教育部、民政部、国家市场监管总局启动了校外培训机构治理专项督查工作。5月9日至10日,督查组率先在北京市开展华···

山西综改区举办省技术创新中心申报培训

  8月18日,山西综改区科技金融部举办2023年度省技术创新中心申报培训会,来自区内企业、科研院所及有关单位代表160余人参加了培训。  山西省技术创新中心是以产业前沿引领技术和关键共性技术研发为核心的产业技术创新平台,承担着为区域和产业···

山西汾阳医院开展健康教育与控烟知识培训

来源:【吕梁日报-吕梁新闻网】本报讯 (记者 刘少伟) 5月18日,在“世界无烟日”到来之际,山西汾阳医院组织开展健康教育与控烟知识培训。近年来,山西汾阳医院全面落实健康中国战略,根据国家卫健委《关于2011年起全国医疗卫生系统全面禁烟的决···

山西省文物局年度田野考古技术培训班开班

10月10日,山西省文物局在运城闻喜上郭城址、邱家庄墓群举办2023年度田野考古技术培训班开班仪式。该次培训为期三个月,通过理论和实践两部分教学,旨在推进山西考古工作高质量发展,提升考古业务人员专业技术水平。本次培训由山西省考古研究院和山西···

最低每课时9元!全省学科类校外培训课时长和收费标准出台

近日,山西省发改委、省教育厅下发《关于中小学学科类校外培训收费标准及有关事项的通知》,明确全省中小学学科类校外培训收费标准,从12月17日起执行。《通知》对全省线上线下学科类校外培训基准收费标准和浮动幅度制定了科学标准。其中,义务教育阶段线···

山西天镇 阳光职业培训学校培养乡村“新农人”乡村振兴添动能

(记者 贺文生) 山西天镇县阳光职业培训学校紧紧围绕乡村振兴战略,按照“政府引导、农民自愿、立足产业、突出重点”的原则,创新高素质农民技能培训方式方法,采取以“授人以渔”的方式,让人才振兴成为助推农业农村现代化的内生动力,以高素质农民引领现···

山西:建立全过程 全链条 无缝隙安全培训制度

黄河新闻网讯(记者杨江涛)日前,山西省应急管理厅下发了《山西省安全培训管理暂行办法》(以下简称《办法》)。我省将进一步抓好安全生产这个基本盘、基本面,推动全省安全培训工作制度化、规范化、科学化,促进安全培训工作高质量发展。山西省应急管理厅厅···

山西:艺考培训机构纳入全国监管平台管理

央广网太原10月6日消息(记者郎麒) 日前,山西省教育厅、省发改委、省公安厅等部门联合制定《加强面向高中阶段学生艺考培训规范管理工作方案》,针对艺考培训的突出特点和实际情况,全面规范艺考培训行为,将艺考培训机构统一纳入全国校外教育培训监管与···

太平财险阳泉中支开展消防安全教育和有限空间作业培训

为强化员工安全意识,进一步提升员工消防和有限空间突发事件应急处理能力,9月14日,太平财险阳泉中支邀请北京市卫民安消防教育咨询中心山西分中心讲师向全体员工开展了一次消防安全教育和有限空间作业课程培训。按照防消结合、预防为主的原则,本次讲座通···

山西省数字化转型贯标试点工作宣贯培训会在太原举行

  10月20日消息,山西省数字化转型贯标试点工作宣贯培训会在太原举行。省工信厅介绍,作为国家数字化转型贯标试点省份,试点启动后将引导企业加快数字化转型,助力制造业高端化、智能化、绿色化发展。  今年,工信部启动数字化转型贯标试点工作,我省···

山西马兰花创业培训讲师大赛收官 太原市获多个奖项

山西新闻网8月31日讯(记者 冯耿姝)8月29日,山西省第四届马兰花创业培训讲师大赛圆满收官,太原市代表队在比赛中分获多个二、三等奖和优秀奖。本届大赛以“启迪创新思维·激发创业梦想”为主题,全省共有56名教师晋级复赛,其中,太原市有7名选手···