第 1 章 初识 C 语言
■ C 的历史和特性
■ 编写程序的步骤
■ 编译器和连接器的一些知识
■ C 标准
1.1 C 语言的起源
1972年,贝尔实验室的 丹尼斯 • 里奇(Dennis Ritch) 和 肯 • 汤普逊(Ken Thompson)在开发 UNIX 操做系统 时设计了 C 语言。然而,C 语言不彻底是里奇突发奇想而来,他是在 B 语言(汤普逊发明)的基础上进行设计。至于 B 语言的起源,那是另外一个故事。C 语言设计的初衷是将其做为程序员使用的一种编程工具,所以,其主要目标是成为有用的语言。
1.2 C 语言的特性
1) C 语言的设计理念让用户能轻松地完成
自顶向下 的规划
、结构化编程 和
模块化设计。
2) C 是
高效 的语言。
C 代码紧凑 运行速度很快 。C 语言具备一般是汇编语言才具备的
微调控制能力,能够根据具体状况微调程序以得到最大运行速度或最有效地使用内存。
3) C 是
可移植 的语言。C 语言是可移植方面的佼佼者。从 8 位微处理器到克雷超级计算机,许多计算机体系结构均可以使用
C 编译器(C编译器是把 C 代码转换成计算机内部指令的程序)。可是要注意,程序中针对特殊硬件设备(如,显示监视器)或操做系统特殊功能(如,Windows 8 或 OS X)编写的部分,一般是不可移植的。
4) C 语言
功能强大且灵活。
5) C 语言是为了
知足程序员的需求 而设计的,程序员利用
C 能够访问硬件、操控内存中的位。
6) 大多数 C 实现都有一个大型的
库,包含众多
有用的 C 函数。
7) C 缺点:
C 语言使用指针,而涉及指针的编程错误每每难以察觉。有句话说的好:想拥有自由就必须时刻保持警戒。
1.3 C 语言的应用范围
早在 20 世纪 80 年代,
C 语言 就已经成为小型计算机(UNIX系统)使用的 主流语言。从那之后,C 语言的应用范围扩展到 微型机(我的计算机)和大型机(庞然大物)。许多软件公司都用 C 语言来开发文字处理程序、电子表格、编译器和其余产品。由于用 C 语言编写的程序紧凑而高效。更重要的是,C 程序很方便修改,并且移植到新型号的计算机中也没什么问题。
愈来愈多的计算机用户已转而求助 C 语言解决一些安全问题。
20 世纪 90 年代,许多软件公司开始改用
C++ 来开发大型的编程项目。 C++ 在 C 语言的基础上嫁接了面向对象编程工具(面向对象编程是一门哲学,它经过对语言建模来适应问题,而不是对问题建模以适应语言)。C++ 几乎是 C 的超集,这意味着任何 C 程序差很少就是一个 C++ 程序。
虽然这些年来 C++ 和 JAVA 很是流行,可是 C 语言还是软件业中的核心技能。特别是,
C 语言已成为嵌入式系统编程的流行语言。C 语言是开发操做系统的卓越语言。
1.4 计算机能作什么
中央处理单元(CPU)承担绝大部分的运算工做。随机存取内存(RAM)是存储程序和文件的工做区;而永久内存存储设备(过去通常指机械硬盘,如今还包括固态硬盘)即便在关闭计算机后,也不会丢失以前储存的程序和文件。另外,还有各类外围设备(如,键盘、鼠标、触摸屏、监视器)提供人与计算机之间的交互。
CPU 的工做很是简单,它从内存中获取并执行一条指令,而后再从内存中获取并执行下一条指令,诸如此类(一个吉赫兹的CPU一秒钟能重复这样的操做大约十亿次,所以,CPU 能以惊人的速度从事枯燥的工做)。CPU 有本身的小工做区——若干个寄存器组成,每一个寄存器均可以储存一个数字。一个寄存器储存下一条指令的内存地址,CPU 使用该地址来获取和更新下一条指令。在获取指令后,CPU 在另外一个寄存器中储存该指令,并更新第 1 个寄存器储存下一条指令的地址。CPU 能理解的指令有限(这些指令的集合叫做 指令集)。并且,这些指令至关具体,其中的许多指令都是用于请求计算机把一个数字从一个位置移动到另外一个位置。例如,从内存移动到寄存器。
下面介绍两个有趣的知识:
1) 其一,储存在计算机中的全部内容都是数字。
计算机以数字形式储存数字和字符(如,在文本文档中使用的字母)。每一个字符都有一个数字码。计算机载入寄存器的指令也以数字形式储存,指令集中的每条指令都有一个数字码。
2) 其二,计算机程序最终必须以数字指令码(即,机器语言)来表示。
简而言之,计算机的工做原理是:若是但愿计算机作某些事,就必须为其提供特殊的指令列表(程序),确切地告诉计算机要作的事以及如何作。你必须用计算机能直接明白的语言(机器语言)建立程序。
1.5 高级计算机语言和编译器
高级编程语言(如,C)以多种方式简化了编程工做。首先,没必要用数字码表示指令;其次,使用的指令更贴近你如何想这个问题,而不是相似计算机那样繁琐的步骤。使用高级编程语言,能够在更抽象的层面表达你的想法,不用考虑 CPU 在完成任务时具体须要哪些步骤。
编译器是把 高级语言程序 翻译成 计算机能理解的机器语言指令集 的程序。程序员进行高级思惟活动,而编译器则负责处理冗长乏味的细节工做。
编译器还有一个优点。使用合适的编译器或编译器集,即可把一种高级语言程序转换成供各类不一样类型 CPU 使用的机器语言程序。
简而言之,高级语言(如 C、Java、Pascal )以更抽象的方式描述行为,不受限于特定 CPU 或指令集。并且,高级语言简单易学,用高级语言编程比用机器语言编程容易得多。
1.6 语言标准
C 语言发展之初,并无所谓的 C 标准。1987 年,布莱恩 • 柯林汉(Brian Kernighan)和 丹尼斯 • 里奇(Dennis Ritchie)合著的 The C Programming Language (《C 语言程序设计》) 第 1 版是公认的 C 标准,一般称之为 K&R C 或 经典 C 。特别是,该书的附录中 “C 语言参考手册” 已成为实现 C 的指导标准。例如,编译器都声称提供完整的 K&R 实现。虽然这本书中的附录定义了 C 语言,但却没有定义 C 库。与大多数语言不一样的是, C 语言比其余语言更依赖库,所以须要一个标准库。实际上,因为缺少官方标准,UNIX 实现提供的库已成为了标准库。
1.6.1 第 1 个 ANSI/ISO C 标准
美国国家标准协会(ANSI)于 1983 年组建了一个委员会(X3J11),开发了一套新标准,并于 1989 年正式公布。该标准(ANSI C)定义了 C 语言和 C 标准库。国际标准化组织于 1990 年采用了这套 C 标准(ISO C)。ISO C 和 ANSI C 是彻底相同的标准。ANSI / ISO 标准的最终版本一般叫做 C89 (由于 ANSI 于 1989 年批准该标准)或 C90 (由于 ISO 于 1990 年批准该标准)。另外,因为 ANSI 先公布 C 标准,所以业界人士一般使用 ANSI C。
在该委员会制定的指导原则中,最有趣的多是:
保持 C 的精神。委员会在表述这一精神列出了一下几点:
■ 信任程序员;
■ 不要妨碍程序员作须要作的事;
■ 保持语言精炼简单;
■ 只提供一种方法执行一项操做;
■ 让程序运行更快,即便不能保证其可移植性。
在最后一点上,标准委员会的用意是:做为实现,应该针对目标计算机来定义最合适的某特定操做,而不是强加一个抽象、统一的定义。在学习 C 语言过程当中,许多方面都反映了这一哲学思想。
1.6.2 C99 标准
1994 年,ANSI / ISO 联合委员会(C9X委员会)开始修订 C 标准,最终发布了 C99 标准。该委员会遵循了最初 C90 标准的原则,包括保持语言的精炼简单。委员会的用意不是在 C 语言中添加新特性,而是为了达到新的目标。第 1 个目标是,支持国际化编程。例如,提供多种方法处理国际字符集。第 2 个目标是,“调整现有实践致力于解决明显的缺陷”。所以,在遇到须要将 C 移至 64 位处理器时,委员会根据现实生活中处理问题的经验来添加标准。第 3 个目标是,为适应科学和工程项目中的关键数值计算,提升 C 的适应性,让 C 比 FORTRAN 更有竞争力。
这 3 点 (国际化、弥补缺陷 和 提升计算的实用性)是主要的修订目标。在其余方面的改变则更为保守,例如,尽可能与 C90、C++ 兼容,让语言在概念上保持简单。用委员会的话说:“.……委员会很满意让 C++ 成为 大型、功能强大的语言 ”。
C99 的修订保留了 C 语言的精髓, C 还是一门简洁高效的语言。本书指出了许多 C99 修改的地方。虽然该标准已发布了很长时间,但并不是全部的编译器都彻底实现 C99 的全部改动。所以,你可能发现 C99 的一些改动在本身的系统中不可用,或者只有改变编译器的设置才可用。
1.6.3 C11 标准
维护标准任重道远。标准委员会在 2007 年承诺 C 标准的下一个版本是 C1X,2011年终于发布了 C11 标准。这次,委员会提出了一些新的指导原则。出于对当前编程安全的担心,不那么强调 “信任程序员” 目标了。并且,供应商并未像对 C90 那样很好地接受和支持 C99 。这使得 C99 的一些特性成为 C11 的可选项。由于委员会认为,不该要求服务小型机市场的供应商支持其目标环境中用不到的特性。另外须要强调的是,修订标准的缘由不是由于原标准不能用,而是须要跟进新的技术。例如,新标准添加了可选项支持当前使用多处理器的计算机。
1.7 使用 C 语言的 7 个步骤
C 是编译型语言。若是以前使用过
编译型语言(如,Pascal 或 FORTRAN),就会很熟悉组建 C 程序的几个基本步骤。可是,若是之前使用的是
解释型语言(如,BASIC)或
面向图形界面语言(如, Visual Basic),或者甚至没接触过任何编程语言,就有必要学习如何编译。别担忧,这并不复杂。首先,为了让读者对编程有大概的了解,咱们把编写 C 程序的过程分解成 7 个步骤。注意,这是理想状态。在实际的使用过程当中,尤为是在较大型的项目中,可能要作一些重复的工做,根据下一个步骤的状况来调整或改进上一个步骤。
1) 定义程序的目标
2) 设计程序
3) 编写代码
4) 编译
5) 运行程序
6)测试和调试程序
7) 维护和修改程序
1.7.1 第 1 步:定义程序的目标
想要程序去作什么首先本身要明确本身想作什么,思考你的程序须要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。在这一步骤中,不涉及具体的计算机语言,应该用通常术语来描述问题。
1.7.2 第 2 步:设计程序
对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。例如,用户界面应该是怎样的?如何组织程序?目标用户是?准备花多长时间来完成这个程序?
除此以外,还要决定在程序(还多是辅助文件)中如何表示数据,以及用什么方法处理数据。学习 C 语言之初,遇到的问题都很简单,没什么可选的。可是,随着要处理的状况愈来愈复杂,须要决策和考虑的方面也愈来愈多,一般,选择一个合适的方式表示信息能够更容易地设计程序和处理数据。
再次强调,应该用通常术语来描述问题,而不是用具体的代码。可是,你的某些决策可能取决于语言的特性。例如,在数据表示方面,C 的程序员就比 Pascal 的程序员有更多选择。
1.7.3 第 3 步:编写代码
设计好程序后,就能够编写代码来实现它。也就是说,把你设计的程序翻译成 C 语言。这里是真正须要使用 C 语言的地方。能够把思路写在纸上,可是最终仍是要把代码输入计算机。这个过程的机制取决于编程环境,咱们稍后会详细介绍编程环境。通常而言,使用
文本编辑器 建立
源代码 文件。该文件中内容就是你翻译的 C 语言代码。程序清单 1.1 是一个 C 源代码的示例。
在这一步骤中,应该给本身编写的程序添加文字注释。最简单的方式是使用 C 的注释工具在源代码中加入对代码的解释。
1.7.4 第 4 步:编译
前面介绍过,编译器是把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。如前所述,不一样的计算机使用不一样的机器语言方案。C 编译器负责把 C 代码翻译成特定的机器语言。此外,C 编译器还将源代码与 C 库(库中包含大量的标准函数供用户使用,如 printf() 和 scanf() )的代码合并成最终的程序(更精确地说,应该是由一个被称为 连接器 的程序来连接库函数,可是在大多数系统中,编译器运行连接器)。其结果是,生成一个用户能够运行的可执行文件,其中包含着计算机能理解的代码。
编译器还会检查 C 语言程序是否有效。若是 C 编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另外一项技能。
1.7.5 第 5 步:运行程序
传统上,可执行文件是可运行的程序。
1.7.6 第 6 步:测试和调试程序
接下来,应该检查程序是否按照你所设计的思路运行。
你会发现你的程序中有一些错误,计算机行话叫做 bug。查找并修复程序错误的过程叫 调试。
1.7.7 第 7 步:维护和修改代码
建立完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。
1.8 编程机制
用 C 语言编写程序时,编写的内容被储存在文本文件中,该文件被称为 源代码文件(source code file)。大部分 C 系统,包括以前提到的,都要求文件名以 .c 结尾(如,wordcount.c 和 budget.c)。在文件名中,点号 (.) 前面的部分称为 基本名(basename),点号后面的部分称为 扩展名(extension)。所以,budget 是基本名,c 是扩展名。基本名与扩展名的组合(budget.c)就是文件名。文件名应该知足特定计算机操做系统的特殊要求。例如,MS-DOS 是 IBM PC 及其兼容机的操做系统,比较老旧,它要求基本名不能超过 8 个字符。所以,刚才提到的 文件名 wordcount.c 就是无效的 DOS 文件名。有些 UNIX 系统限制整个文件名(包括扩展名)不超过 14 个字符,而有些 UNIX 系统则容许使用更长的文件名,最多 255 个字符。Linux、Windows 和 Macintosh OS 都容许使用长文件名。
接下来,咱们来看一下具体的应用,假设有一个名为 concrete.c 的源文件,其中的 C 源代码如程序清单 1.2 所示
1 #include <stdio.h>
2 int main(void) 3 { 4 printf("Concrete contains gravel and cement.\n"): 5 // 混泥土 包含 沙砾、碎石 水泥
6
7 return 0; 8
9 } 10
11 /********************************************* 12 输出结果: 13 --------------------------------------------- 14 Concrete contains gravel and cement. 15 --------------------------------------------- 16 **********************************************/
1.8.1 目标代码文件、可执行文件和库
C 编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。典型的 C 实现经过编译和连接两个步骤来完成这一过程。编译器把源代码转换成中间代码,连接器把中间代码和其余代码合并,并生成可执行文件。
C 使用这种分而治之的方法方便对程序进行模块化,能够独立编译单独的模块,稍后再用连接器合并已编译的模块。经过这种方式,若是只要更改某个模块,没必要所以从新编译其余模块。另外,连接器还将你编写的程序和预编译的库代码合并。
中间文件有多种形式。咱们在这里描述的是最广泛的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码,可是并不能直接运行该文件。由于目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。
目标代码文件缺失 启动代码(startup code)。启动代码充当着程序和操做系统之间的接口。例如,能够在 MS Windows 或 Linux 系统下运行 IBM PC 兼容机。这两种状况所使用的硬件相同,因此目标代码相同,可是 Windows 和 Linux 所需的启动代码不一样。由于这些系统处理程序的方式不一样。
目标代码还缺乏 库函数。几乎全部的 C 程序都要使用 C 标准库中的函数。例如,concrete.c 中就是用了 printf() 函数。目标代码文件并不包含该函数的代码,它只包含了使用 printf() 函数的指令。printf() 函数真正的代码储存在另外一个被称为 库 的文件中。库文件中有许多函数的目标代码。
连接器的做用是,把你编写的目标代码、系统的标准启动代码 和 库代码这 3 部分合并成一个文件,便可执行文件。对于库代码,连接器只会把程序中要用到的库函数代码提取出来。
简而言之,目标文件和可执行文件都是由机器语言指令组成的。然而,目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含你编写的程序中使用的库函数和启动代码的机器代码。
在有些系统中,必须分别运行编译程序和连接程序,而在另外一些系统中,编译器会自动启动连接器,用户只须要给出编译命令便可。
1.8.2 UNIX 系统
1. 在 UNIX 系统上编辑
UNIX C 没有本身的编辑器,可是可使用通用的 UNIX 编辑器,如 emacs、jove、vi 或 X Window System 文本编辑器。
做为程序员,要负责输入正确的程序和为储存该程序的文件起一个合适的文件名。如前所述,文件名应该以 .c 结尾。注意,UNIX 区分大小写。所以,budget.c、BUDGET.c 和 Budget.c 是 3 个不一样但都有效的 C 源文件名。可是,BUDGET.C 是无效文件名,由于该名称的扩展名使用了大写 C 而不是小写 c 。
假设咱们在 vi 编译器中编写了下面的程序,并将其储存在 inform.c 文件中:
2. 在 UNIX 系统上编译
之前,UNIX C 编译器要调用语言定义的 cc 命令。可是,它没有跟上标准发展的脚步,已经退出了历史舞台。
可是,UNIX 系统提供的 C 编译器一般来自一些其余源,而后以 cc 命令做为编译器的别名。所以,虽然在不一样的系统中会调用不一样的编译器,可是用户仍能够继续使用相同的命令。
编译 inform.c,要输入如下命令:
cc inform.c
几秒钟后,会返回 UNIX 的提示,告诉用户任务已完成。若是程序编写错误,你可能会看到警告或错误消息,但咱们先假设编写的程序彻底正确(若是编译器报告 void 错误,说明你的系统未更新成 ANSI C 编译器,只需删除 void 便可)。
若是使用 ls 命令列出文件,会发现有一个 a.out 文件。该文件是包含已翻译(或已编译)程序的可执行文件。要运行该文件,只需输入:
a.out
输出内容以下:
A .c is used to end a C program filename.
若是要储存可执行文件(a.out),应该把它重命名。不然,该文件会被下一次编译程序时生成的新 a.out 文件替换。
如何处理目标代码?C 编译器会建立一个与源代码基本名相同的目标代码文件,可是其扩展名是 .o 。在该例中,目标代码文件是 inform.o。然而,却找不到这个文件,由于一旦连接器生成了完整的可执行程序,就会将其删除。若是原始程序有多个源代码文件,则保留目标代码文件。学到后面多文件程序时,你会明白到这样作的好处。
1.8.3 GNU 编译器集合和 LLVM 项目
GNU 项目始于 1987 年,是一个开发大量免费 UNIX 软件的集合(GNU 的意思是 “GNU‘s Not UNIX ”,即 GNU 不是 UNIX)。GNU 编译器集合(也被称为 GCC,其中包含 GCC C 编译器)是该项目的产品之一。GCC 在一个指导委员会的带领下,持续不断地开发,它的 C 编译器紧跟 C 标准的改动。GCC 有各类版本以适应不一样的硬件平台和操做系统,包括 UNIX、Linux 和 Windows。用 gcc 命令即可调用 GCC C 编译器。许多使用 gcc 的系统都用 cc 做为 gcc 的别名。
LLVM 项目成为 cc 的另外一个代替品。该项目是与编译器相关的开源软件集合,始于伊利诺伊大学的 2000 份研究项目。它的 Clang 编译器处理 C 代码,能够经过 clang 调用。有多种版本供不一样的平台使用,包括 Linux。2012 年,Clang 成为 FreeBSD 的默认 C 编译器。Clang 也对最新的 C 标准支持得很好。
GNU 和 LLVM 均可以使用 -v 选项来显示版本信息,所以各系统都使用 cc 别名来代替 gcc 或 clang 命令。如下组合:
cc -v
显示你所使用的编译器及其版本。
gcc 和 clang 命令均可以根据不一样的版本选择运行时选项来调用不一样 C 标准。
gcc -std=c99 inform.c 【GCC 最基本的用法是:gcc [options] [filename], 其中 options 是所需的参数,filename 是文件名】
gcc -std=c1x inform.c
gcc -std=c11 inform.c
第 1 行调用 C99 标准,第 2 行调用 GCC 接受 C11 以前的草案标准,第 3 行调用 GCC 接受的 C11 标准版本。Clang 编译器在这一点上用法与 GCC 相同。
1.8.4
Linux 系统
Linux 是一个开源、流行、相似于 UNIX 的操做系统,可在不一样平台(包括 PC 和 Mac)上运行。在 Linux 中准备 C 程序与在 UNIX 系统中几乎同样,不一样的是要使用 GNU 提供的 GCC 公共域 C 编译器。编译命令相似于:
gcc inform.c
注意,在安装 Linux 时,可选择是否安装 GCC。若是以前没有安装 GCC,则必须安装。一般,安装过程会将 cc 做为 gcc 的别名,所以能够在命令行中使用 cc 来代替 gcc。
1.8.5 PC 的命令行编译器
C 编译器不是标准 Windows 软件包的一部分,所以须要从别处获取并安装 C 编译器。能够从互联网免费下载 Cygwin 和 MinGW,这样即可在 PC 上经过命令行使用 GCC 编译器。Cygwin 在本身的视窗运行。模仿 Linux 命令行环境,有一行命令提示。MinGW 在 Windows 的命令提示模式中运行。这和 GCC 的最新版本同样,支持 C99 和 C11 最新的一些功能。Borland 的 C++ 编译器 5.5 也能够免费下载,支持 C90。
源代码文件应该是 文本文件,而不是字处理器文件(字处理器文件包含许多额外的信息,如字体和格式等。)所以,要使用文本编辑器(如,Windows Notepad)来编辑源代码。若是使用字处理器,要以文本模式另存文件。源代码文件的扩展名应该是 .c 。一些字处理器会为文本文件自动添加 .txt 扩展名。若是出现这种状况,要更改文件名,把 txt 替换成 c 。
一般,C 编译器生成的中间目标代码文件的扩展名是 .obj (也多是其余扩展名)。与 UNIX 编译器不一样,这些编译器在完成编译后一般不会删除这些中间文件。有些编译器生成带 .asm 扩展名的汇编语言文件,而有些编译器则使用本身特有的格式。
一些编译器在编译后会自动运行连接器,另外一些要求用户手动运行连接器。在可执行文件中连接的结果是,在原始的源代码基本名后面加上 .exe 扩展名。例如,编译和连接 concrete.c 源代码文件,生成的是 concrete.exe 文件。能够在命令行输入基本名来运行该程序:
C>concrete
1.8.6
集成开发环境(Windows)
许多供应商(包括微软、Embarcadero、Digital Mars)都提供 Windows 下的集成开发环境,或称为 IDE (目前,大多数 IDE 都是 C 和 C++ 结合的编译器)。能够免费下载的 IDE 有 Microsoft Visual Studio Express 和 Pelles C。利用集成开发环境能够快速开发 C 程序。关键是,这些 IDE 都内置了用于编写 C 程序的编辑器。这类集成开发环境都提供了各类菜单(如,命名,保存源代码文件、编译程序、运行程序等),用户不用离开 IDE 就能顺利编写、编译和运行程序。若是编译器发现错误,会返回编辑器中,标出有错误的行号,并简单描述状况。
初次接触 Windows IDE 可能望而生畏,由于它提供了多种目标(target),即运行程序的多种环境。例如,
IDE 提供了 32位 Windows 程序、64 位 Windows 程序、动态连接库文件(DLL)等。许多目标都涉及 Windows 图形界面。要管理这些(及其余)选择,一般要先建立一个项目(project),以便稍后在其中添加待使用的源代码文件名。不一样的产品具体步骤不一样。通常而言,首先使用【文件】菜单或【项目】菜单建立一个项目。选择正确的项目形式很是重要。本书中的例子都是通常示例,针对在简单的命令行环境中运行而设计。Windows IDE 提供多种选择以知足用户的不一样要求。例如,Microsoft Visual studio 提供 【Win32控制台应用程序】选项。对于其余系统,查找一个诸如【DOS EXE】、【Console】或 【Character Mode】的可执行选项。选择这些模式后,将在一个类控制台窗口中运行可执行程序。选择好正确的项目类型后,使用 IDE 的菜单打开一个新的源代码文件。对于大多数产品而言,使用【文件】菜单就能完成。你可能须要其余步骤将源文件添加到项目中。
一般,Windows IDE 便可处理 C 也能够处理 C++,所以要指定待处理的程序是 C 仍是 C++ 。有些产品用项目类型区分二者,
有些产品(如,Microsoft Visual C++)用 .c 文件扩展名来指明使用 C 而不是 C++。
你可能会遇到一个问题:
在程序执行完毕后,执行程序的窗口当即消失。若是不但愿出现这种状况,可让程序暂停,直到按下 Enter 键,窗口才消失。要实现这种效果,能够在程序的最后(return 这行代码以前) 添加下面一行代码:
getchar();
该行读取一次键的按下,因此程序在用户按下 Enter 键以前会暂停。有时根据程序的须要,可能还须要一个击键等待。这种状况下,必须用两次 getchar():
getchar();
gerchar();
例如,程序在最后提示用户输入体重。用户键入体重后,按下 Enter 键以输入数据。程序将读取体重,第 1 个 getchar() 读取 Enter 键,第 2 个 getchar() 会致使程序暂停,直至用户再次按下 Enter 键。
Microsoft Visual Studio 和 C 标准
在 Windows 软件开发中,Microsoft Visual Studio 及其免费版本 Microsoft Visual Studio Express 都久负盛名,它们与 C 标准的关系也很重要。然而,
微软鼓励程序员从 C 转向 C++ 和 C#。虽然 Visual Studio 支持 C89/C90,可是到目前为止,它只选择性地支持那些在 C++ 新特性中能找到的 C 标准(如, long long 类型)。并且,自 2012 版本起,Visual Studio 再也不把 C 做为项目类型的选项,尽管如此,本书中的绝大多数程序仍可用 Visual Studio 来编译。在新建项目时,选择 C++ 选项,而后选择【Win32 控制台应用程序】,在应用设置中选择【空项目】。几乎全部的 C 程序都能与 C++ 程序兼容。因此,本书中的绝大多数 C 程序均可做为 C++ 程序运行。或者,在选择 C++ 选项后,将默认的源文件扩展名 .cpp 替换成 .c ,编译器便会使用 C 语言的规则代替 C++。
1.8.7 Windows / Linux
许多 Linux 发行版均可以安装在 Windows 系统中,以建立双系统。一些存储器会为 Linux 系统预留空间,以即可以启动 Windows 或 Linux 。能够在 Windows 系统中运行 Linux 程序,或在 Linux 系统中运行 Windows 程序。不能经过 Windows 系统访问 Linux 文件,可是能够经过 Linux 系统访问 Window 文档。
1.8.8 Macintosh 中的 C
目前,苹果免费提供 Xcode 开发系统下载。它容许用户选择不一样的编程语言,包括 C 语言。
Xcode 凭借可处理多种编程语言的能力,可用于多平台,开发超大型的项目。在 Xcode 4.6 中,经过【File】菜单选择【New Project】,而后选择【OS X Application Command Line Tool】,接着输入产品名并选择 C 类型。
Xcode 使用 Clang 或 GCC C 编译器来编译 C 代码,它之前默认使用 GCC,可是如今默认使用 Clang。
UNIX 系统内置 Mac OS X,终端工具打开的窗口是让用户在 UNIX 命令行环境中运行程序。苹果在标准软件包中不提供命令行编译器,可是,若是下载了 Xcode ,还能够下载可选的命令行工具,这样就可使用 Clang 和 gcc 命令在命令行模式中编译。
............
1.11 本章小结
C 是强大而简洁的编程语言。它之因此流行,在于自身提供大量的实用编程工具,能很好地控制硬件。并且,与大多数其余程序相比,C 程序更容易从一个系统移植到另外一个系统。
C 是编译型语言。C 编译器 和 连接器 是把 C 语言源代码 转换成 可执行代码 的程序。
复习题html
1. 对编程而言,可移植性意味着什么?git
完美的可移植程序是,其源代码无需修改就能在不一样的计算机系统中成功编译的程序。程序员
2. 解释源代码文件、目标代码文件和可执行文件有什么区别?编程
源代码文件包含程序员使用的任何编程语言所写的代码。目标代码文件包含机器语言代码,它不是完整的程序代码。windows
可执行文件包含组成可执行程序的完整机器语言代码。安全
3. 编程的7个主要步骤是什么?编程语言
(1)定义程序目标;(2)设计程序;(3)编写程序;(4)编译程序;(5)运行程序;(6)测试和调试程序;(7)维护和修改程序编辑器
4. 编译器的任务是什么?模块化
编译器吧源代码(如,用C语言编写的代码)翻译成等价的机器语言代码(也叫做目标代码)。函数
5. 连接器的任务是什么?
连接器把编译器翻译好的源代码以及库代码和启动代码组合起来,生成一个可执行程序。
编程练习
你刚被MacroMuscle有限公司聘用。该公司准备进入欧洲市场,须要一个把英寸单位转换为厘米单位(1英寸=2.54厘米)的程序。
该程序要提示用户输入英寸值。你的任务是定义程序目标和设计程序(编程过程的第1步和第2步)。
1 /************************************************************* 2 编程练习 3 1. 你刚被MacroMuscle有限公司聘用。该公司准备进入欧洲市场, 4 须要一个吧英寸单位转换为厘米单位(1英寸 = 2.54厘米)的程序。 5 该程序要提示用户输入英寸值。你的任务是定义程序目标和设计程 6 序(编程过程的第1步和第2步)。 7
8 1) 定义程序目标 9 程序的目标 :须要将 英寸 单位转换为 厘米 单位 10 程序须要提示用户输入英寸的数据、英寸转换为厘米的换算公式 显示换算后的结果 11 2)设计程序 12 程序的界面 直接用 printf() 打印 提示语便可 提示用户输入英寸数据 13 1 英寸 = 2.54 厘米 (换算公式) 14 根据换算公式可知 程序中应使用 float 或者 double 的数据类型的数据 以确保相应的精度 15 程序应该当用户输入英寸数据后 根据换算公式 将其处理转换成 厘米为单位后 经过 printf()函数将结果打印输出 16 **************************************************************/
17
18 #include <stdio.h>
19
20 int main(void) 21 { 22 float fInch = 0.0f; // 英寸
23 float fCm = 0.0f; // 厘米
24
25 printf("Please input inch: "); // 提示用户输入英寸值
26
27 scanf_s("%f", &fInch); 28
29 fCm = fInch * 2.54f; // 根据公式将英寸转换为厘米
30
31 printf("%.2f inch = %.2f cm\n", fInch, fCm); // 输出结果
32
33 getchar(); // 接收输入数据后的 Enter
34 getchar(); // 起暂停做用 等待用户再次按下 Enter 35 // 此程序如在 windows 10 中文环境下运行时, 36 // 请将输入法切换为 英文状态 37 // 不然须要按多一次 Enter 键
38 return 0; 39 } 40 /************************************************** 41 输出结果: 42 --------------------------------------------------- 43 Please input inch: 4 44 4.00 inch = 10.16 cm 45 --------------------------------------------------- 46
47 **************************************************/