可以把程序看作是你希望计算机如何完成任务的描述。编译器负责处理一些细节工作,例如把你要计算机完成的任务转换成底层的机器语言。
由于编译器不具有真正的智能,所以必须用编译器能理解的术语表达我们的意图,这些术语就是C语言标准规定的形式规则(尽管有些约束,但总比直接用机器语言方便得多)。
简单的C程序示例
#include <stdio.h>
#define MAX 1000
/*
main函数
C程序包含一个或多个函数,它们是C程序的基本模块
*/
int main(void)
{
int num; /* 定义一个名为num的变量 */
num = 1; /* 为num赋一个值 */
printf("I am a simple "); /* 使用printf()函数 */
printf("computer.\n");
printf("MAX is%d\n", MAX);
printf("My favorite number is %d because it is first.\n",num);
return 0;
}
include预处理指令
#include<stdio.h>
/*
#include <stdio.h>的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。
这是一种“拷贝-粘贴”的操作。include文件提供了一种方便的途径共享许多程序共有的信息。
*/
#include这行代码是一条C预处理器指令(preprocessor directive),C编译器在编译前会对源代码做一些准备工作,即预处理(preprocessing)。
所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使用的输入和输出函数(如,printf)信息。该文件名的含义是标准输入/输出头文件(standard input/output header)。
头文件
通常,在C程序顶部的信息集合被称为头文件(header)。在大多数情况下,头文件包含了编译器创建最终可执行程序要用到的信息。例如,头文件中可以定义一些常量,或者指明函数名以及如何使用它们(函数签名)。但是,函数的实际代码在一个预编译代码的库文件中。
头文件帮助编译器把你的程序正确地组合在一起。ANSI/ISO C规定了C编译器必须提供哪些头文件。
比如我们在项目开发中,可以把一些自己开发的常用的工具函数集中到一起,做成我们自己开发的函数库。然后把相关的函数声明,预定义的常量等封装到一个.h 的头文件中。
main()函数
int main(void)
C程序一定从main()函数开始执行(目前不必考虑例外的情况)。int是main()函数的返回类型。这表明main()函数返回的值是整数。返回到哪里?返回给操作系统。除了main()函数,你可以任意命名其他函数,而且main()函数必须是开始的函数
注释
/*一个简单的程序*/
在程序中,被/* */两个符号括起来的部分是程序的注释。写注释能让他人(包括自己)更容易明白你所写的程序。
C99新增了另一种风格的注释,普遍用于C++和Java。这种新风格使用//符号创建注释,仅限于单行。
// 这种注释只能写成一行。
int rigue; // 这种注释也可置于此。
花括号、函数体和块
花括号把main()函数括起来。一般而言,所有的C函数都使用花括号标记函数体的开始和结束。这是规定,不能省略。只有花括号({})能起这种作用,圆括号(())和方括号([])都不行。
花括号还可用于把函数中的多条语句合并为一个单元或块。
if () {
...
}
while(condation) {
}
声明
int num;
这行代码叫作声明(declaration)。声明是C语言最重要的特性之一。在该例中,声明完成了两件事。
其一,在函数中有一个名为num的变量(variable)。
其二,int表明num是一个整数。
CPU是做运算的硬件,程序代码指令和数据在运行时是保存在内存中的。
int是一种数据类型。编译器使用这些信息为num变量在内存中分配存储空间。
示例中的num是一个标识符(identifier),也就是一个变量、函数或其他实体的名称。声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了存储在某位置的信息类型或数据类型。
在C语言中,所有变量都必须先声明才能使用。这意味着必须列出程序中用到的所有变量名及其类型。
C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。因此,stars和Stars、STARS都不同。
赋值
num = 1;
赋值是C语言的基本操作之一。该行代码的意思是“把值1赋给变量num”
在执行int num;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语句时,把值存储在之前预留的位置。可以给num赋不同的值,这就是num之所以被称为变量(variable)的原因
赋值表达式语句从右侧把值赋到左侧。另外,该语句以分号结尾
函数声明
/* two_func.c -- 一个文件中包含两个函数 */
#include <stdio.h>
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()中;
第3次出现在函数定义(function definition)中,函数定义即是函数本身的源代码
函数声明就是定义函数的返回值类型,参数的个数,每个参数的类型。
C标准建议,要为程序中用到的所有函数提供函数原型。标准include文件(包含文件)为标准库函数提供了函数原型