C 程序结构
在我们学习 C 语言的基本构建块之前,让我们先来看看一个最小的 C 程序结构,在接下来的章节中可以以此作为参考。
C 程序主要包括以下部分:
让我们看一段简单的代码,可以输出单词 "Hello World":
实例
#include <stdio.h> int main() { printf("Hello, World! \n"); return 0; }
接下来我们讲解一下上面这段程序:
-
程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件。
-
下一行 int main() 是主函数,程序从这里开始执行。
-
下一行 /*...*/ 将会被编译器忽略,这里放置程序的注释内容。它们被称为程序的注释。
-
下一行 printf(...) 是 C 中另一个可用的函数,会在屏幕上显示消息 "Hello, World!"。
-
下一行 return 0; 终止 main() 函数,并返回值 0。
接下来让我们看看如何把源代码保存在一个文件中,以及如何编译并运行它。下面是简单的步骤:
-
打开一个文本编辑器,添加上述代码。
-
保存文件为 hello.c。
-
打开命令提示符,进入到保存文件所在的目录。
-
键入 gcc hello.c,输入回车,编译代码。
-
如果代码中没有错误,命令提示符会跳到下一行,并生成 a.out(Windows 生成 a.exe) 可执行文件。
-
现在,键入 a.out 来执行程序。
-
您可以看到屏幕上显示 "Hello World"。
$ gcc hello.c
$ ./a.out Hello, World!
请确保您的路径中已包含 gcc 编译器,并确保在包含源文件 hello.c 的目录中运行它。
如果是多个 c 代码的源码文件,编译方法如下:
$ gcc test1.c test2.c -o main.out $ ./main.out
test1.c 与 test2.c 是两个源代码文件。
C 基本语法
我们已经看过 C 程序的基本结构,这将有助于我们理解 C 语言的其他基本的构建块。
C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。例如,下面的 C 语句包括五个令牌:
printf("Hello, World! \n");
这五个令牌分别是:
printf
(
"Hello, World! \n"
)
;
在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
例如,下面是两个不同的语句:
printf("Hello, World! \n");
return 0;
C 语言有两种注释方式:
// 单行注释
以 // 开始的单行注释,这种注释可以单独占一行。
/* 单行注释 */
/*
多行注释
多行注释
多行注释
*/
/* */ 这种格式的注释可以单行或多行。
您不能在注释内嵌套注释,注释也不能出现在字符串或字符值中。
C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Manpower 和 manpower 是两个不同的标识符。下面列出几个有效的标识符:
mohd zara abc move_name a_123
myname50 _temp j a23b9 retVal
下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
关键字
|
说明
|
auto
|
声明自动变量
|
break
|
跳出当前循环
|
case
|
开关语句分支
|
char
|
声明字符型变量或函数返回值类型
|
const
|
定义常量,如果一个变量被 const 修饰,那么它的值就不能再被改变
|
continue
|
结束当前循环,开始下一轮循环
|
default
|
开关语句中的"其它"分支
|
do
|
循环语句的循环体
|
double
|
声明双精度浮点型变量或函数返回值类型
|
else
|
条件语句否定分支(与 if 连用)
|
enum
|
声明枚举类型
|
extern
|
声明变量或函数是在其它文件或本文件的其他位置定义
|
float
|
声明浮点型变量或函数返回值类型
|
for
|
一种循环语句
|
goto
|
无条件跳转语句
|
if
|
条件语句
|
int
|
声明整型变量或函数
|
long
|
声明长整型变量或函数返回值类型
|
register
|
声明寄存器变量
|
return
|
子程序返回语句(可以带参数,也可不带参数)
|
short
|
声明短整型变量或函数
|
signed
|
声明有符号类型变量或函数
|
sizeof
|
计算数据类型或变量长度(即所占字节数)
|
static
|
声明静态变量
|
struct
|
声明结构体类型
|
switch
|
用于开关语句
|
typedef
|
用以给数据类型取别名
|
unsigned
|
声明无符号类型变量或函数
|
union
|
声明共用体类型
|
void
|
声明函数无返回值或无参数,声明无类型指针
|
volatile
|
说明变量在程序执行中可被隐含地改变
|
while
|
循环语句的循环条件
|
C99 新增关键字
_Bool
|
_Complex
|
_Imaginary
|
inline
|
restrict
|
C11 新增关键字
_Alignas
|
_Alignof
|
_Atomic
|
_Generic
|
_Noreturn
|
_Static_assert
|
_Thread_local
|
|
|
|
只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。
在 C 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。因此,在下面的语句中:
int age;
在这里,int 和 age 之间必须至少有一个空格字符(通常是一个空白符),这样编译器才能够区分它们。另一方面,在下面的语句中:
fruit = apples + oranges; // 获取水果的总数
fruit 和 =,或者 = 和 apples 之间的空格字符不是必需的,但是为了增强可读性,您可以根据需要适当增加一些空格。