数据结构教程
C/C++基础知识:typedef用法小结
VS2017创建WIN32控制台程序
参考书目:C+Primer+Plus+第6版
如何处理目标代码?
C 编译器会创建一个与源代码基本名相同的目标代码文件,但是其扩展名是.o。在该例中,目标代码文件是 inform.o。然而,却找不到这个文件,因为一旦链接器生成了完整的可执行程序,就会将其删除。如果原始程序有多个源代码文件,则保留目标代码文件。
GNU项目
始于1987年,是一个开发大量免费UNIX软件的集合(GNU的意思是“GNU’s Not UNIX”,即GNU不是UNIX)。GNU编译器集合(也被称为GCC,其中包含GCC C编译器)是该项目的产品之一。GCC有各种版本以适应不同的硬件平台和操作系统,包括UNIX、Linux和Windows。用gcc命令便可调用GCC C编译器。许多使用gcc的系统都用cc作为gcc的别名。
LLVM项目
成为cc的另一个替代品。它的 Clang编译器处理 C代码,可以通过 clang调用。有多种版本供不同的平台使用,包括Linux。2012年,Clang成为FreeBSD的默认C编译器。Clang也对最新的C标准支持得很好。
注意,在安装Linux时,可选择是否安装GCC。如果之前没有安装GCC,则必须安装。通常,安装过程会将cc作为gcc的别名,因此可以在命令行中使用cc来代替gcc。
C编译器不是标准Windows软件包的一部分,因此需要从别处获取并安装C编译器。可以从互联网免费下载Cygwin和MinGW,这样便可在PC上通过命令行使用GCC编译器。
通常,C编译器生成的中间目标代码文件的扩展名是.obj(也可能他扩展名)。与UNIX编译器不同,这些编译器在完成编译后通常不会删除这些中间文件。
一些编译器在编译后会自动运行链接器,另一些要求用户手动运行链接器。在可执行文件中链接的结果是,在原始的源代码基本名后面加上.exe扩展名。例如,编译和链接concrete.c源代码文件,生成的是concrete.exe文件。可以在命令行输入基本名来运行该程序:
C>concrete
你可能会遇到一个问题:在程序执行完毕后,执行程序的窗口立即消失。如果不希望出现这种情况,可以让程序暂停,直到按下Enter键,窗口才消失。要实现这种效果,可以在程序的最后(return这行代码之之前)添加下面一行代码:
getchar();
该行读取一次键的按下,所以程序在用户按下Enter键之前会暂停。有时根据程序的需要,可能还需要一个击键等待。这种情况下,必须用两次getchar():
getchar();
getchar();
例如,程序在最后提示用户输入体重。用户键入体重后,按下Enter键以输入数据。程序将读取体重,第1个getchar()读取Enter键,第2个getchar()会导致程序暂停,直至用户再次按下Enter键。
自2012版本起,Visual Studio不再把C作为项目类型的选项。尽管如此,本书中的绝大多数程序仍可用Visual Studio来编译。在新建项目时,选择C++选项,然后选择【Win32控制台台应用程序】,在应用设置中选择【空项目】。几乎所有的C程序都能与C++程序兼容。所以,本书中的绝大多数C程序都可作为C++程序运行。或者,在选择C++选项后,将默认的源文件扩展名.cpp替换成.c,编译器便会使用C语言的规则代替C++
许多Linux发行版都可以安装在Windows系统中,以创建双系统。一些存储器会为Linux系统预留空间,以便可以启动Windows或Linux。可以在Windows系统中运行Linux程序,或在Linux系统中运行Windows程序。不能通过Windows系统访问Linux文件,但是可以通过Linux系统访问Windows文档。
C是编译型语言。C编译器和链接器是把C语言源代码转换成可执行代码的程序。
#include
该行告诉编译器把stdio.h中的内容包含在当前程序中。stdio.h是C编译器软件包的标准部分,它提供键盘输入和屏幕输出的支持。
作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上,这是一种“拷贝-粘贴”的操作。
int main(void) ←函数名
圆括号表明main()是一个函数名。int表明main()函数返回一个整数,void表明main()不带任何参数。
/* 一个简单的C程序 */ ←注释
C99新增了另一种风格的注释,普遍用于C++和Java。这种新风格使用//符号创建注释,仅限于单行。// 这种注释只能写成一行。
printf()是标准的C库函数
return 0; ←return语句
C函数可以给调用方提供(或返回)一个数。目前,可暂时把该行看作是结束main()函数的要求。
如果遗漏 main()函数中的 return 语句,程序在运行至最外面的右花括号(})时会返回0。
#include
这行代码是一条C预处理器指令(preprocessor directive)。通常,C编译器在编译前会对源代码做一些准备工作,即预处理(preprocessing)。#符号表明,C预处理器在编译器接手之前处理这条指令。
所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使用的输入和输出函数(如, printf())信息。该文件名的含义是标准输入/输出头文件。通常,在C程序顶部的信息集合被称为头文件(header)。
例如,头文件中可以定义一些常量,或者指明函数名以及如何使用它们。
int num;
int feet, fathom;
首次使用变量之前一定要先声明它。编译器在发现使用未声明的RADIUSl时会报错。
声明是C语言最重要的特性之一。在该例中,声明完成了两件事。其一,在函数中有一个名为
num的变量(variable)。其二,int表明num是一个整数。
编译器使用这些信息为num变量在内存中分配存储空间。分号在C语言中是大部分语句和声明的一部分。
初始化(initialize)变量就是为变量赋一个初始值。
可以用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第1个字符必须是字符或下划线,不能是数字。
//* two_func.c -- 一个文件中包含两个函数 */
#include
void butler(void); /* ANSI/ISO C函数原型 */
int main(void)
{
printf("I will summon the butler function.\n");
butler();
printf("Yes. Bring me some tea and writeable DVDs.\n");
return 0;
}
void butler(void) /* 函数定义开始 */
{
printf("You rang, sir?\n");
}
butler()函数在程序中出现了3次。第1次是函数原型(prototype),告知编译器在程序中要使用该函数;第 2 次以函数调用(function call)的形式出现在 main()中;最后一次出现在函数定义(function definition)中,函数定义即是函数本身的源代码。
函数原型是一种声明形式,告知编译器正在使用某函数,因此函数原型也被称为函数声明(function
declaration)。函数原型还指明了函数的属性。例如,butler()函数原型中的第1个void表明,butler()函数没有返回值(通常,被调函数会向主调函数返回一个值,但是 bulter()函数没有)。第 2 个 void (butler(void)中的 void)的意思是 butler()函数不带参数。因此,当编译器运行至此,会检查butler()
是否使用得当。注意,void在这里的意思是“空的”,而不是“无效”。
例如,在C标准中,stdio.h文件包含了printf()的函数原型。
/* 获取用户的输入 */
scanf("%f", &weight);
printf("Your weight in platinum is worth %.2f.\n", value);
为了打印新类型的变量,在printf()中使用%f来处理浮点值。%.2f中的.2用于精确控制输出,指定输出的浮点数只显示小数点后面两位。
在C语言中,用int关键字来表示基本的整数类型。后3个关键字(long、short和unsigned)和C90新增的signed用于提供基本整数类型的变式,例如unsigned short int和unsigned short int和long long int。char关键字用于指定字母和其他字符(如,#、$、%和*)。另外,char类型也可以表示较小的整数。float、double和long double表示带小数点的数。_Bool类型表示布尔值(true或false),_complex和_Imaginary分别表示复数和虚数。
通过这些关键字创建的类型,按计算机的储存方式可分为两大基本类型:整数类型和浮点数类。
最小的存储单元是位(bit),可以储存0或1。
字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1字节均为8位。
字(word)是设计计算机时给定的自然存储单位。对于8位的微型计算机(如,最初的苹果机), 1个字长只有8位。从那以后,个人计算机字长增至16位、32位,直到目前的64位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。