C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


C - 基本语法

C 语言编程 中,"语法"是指程序员编写特定应用程序源代码时所遵循的一套规则。虽然 C 语言中每个关键字都有特定的推荐语法,但在开发 C 语言程序时仍需遵循一些通用规则。

一个典型的 C 语言程序源代码包含以下元素 -

/*Hello World 程序*/ // 注释

#include <stdio.h> // 头文件
int a=10; // 全局声明

// main 函数
int main() {
	char message[] = "Hello World"; // 局部变量
   	printf("%s", message);
   	return 0;
}

C 语言中的标记

C 程序由各种标记组成。标记可以是关键字、标识符、常量、字符串字面量或符号。例如,以下 C 语句由五个标记组成 -

printf("Hello, World!
");

各个标记如下 -

printf
(
   "Hello, World! 
"
);

C 编译器会识别标记是否为关键字、标识符、注释、文字、运算符或任何其他可识别的特殊符号。此操作由标记生成器在编译过程的第一阶段完成。

C 语言中的标识符

C 标识符是用于标识变量、函数或任何其他用户定义项的名称。标识符以字母 A 到 Z、a 到 z 或下划线"_"开头,后跟零个或多个字母、下划线和数字(0 到 9)。

C 语言规定了变量、函数或其他编程元素名称的命名规则。它们不是关键字。标识符必须以字母或下划线开头,并且除了字母、数字和下划线之外不能包含任何其他字符。

C 语言不允许在标识符中使用 @、$ 和 % 等标点符号。C 语言是区分大小写的编程语言。因此,在 C 语言中,Manpower 和 manpower 是两个不同的标识符。以下是一些可接受标识符的示例 -

mohd       zara    abc   move_name  a_123
myname50   _temp   j     a23b9      retVal

C 语言中的关键字

C 语言中最重要的部分是关键字。关键字是保留字,它们具有预定义的含义和规定的语法。在 ANSI C 语言中,所有关键字均采用小写字母。程序员需要选择正确的关键字来构建手头问题的解决方案。学习编程的本质就是学会正确使用关键字。

以下列表列出了 C 语言中的保留字。这些保留字不能用作常量、变量或任何其他标识符名称。

auto else long switch
break enum register typedef
case extern return union
char float short unsigned
const for signed void
continue goto sizeof volatile
default if static while
do int struct _Packed
double

除了本章讲解的基本语法外,C 语言中的每个关键字都有其明确定义的语法。每个关键字的用法将在后续章节中讲解。

C 语言中的分号

在 C 语言程序中,分号是语句终止符。也就是说,每个单独的语句都必须以分号结尾。分号表示一个逻辑实体的结束。

以下给出了两个不同的语句 -

printf("Hello, World!
");
return 0;

由于分号";"只是 C 语言语句的分隔符,因此 C 语言程序中一个物理行中可能有多个语句。同样,在源代码中,单个语句可能跨越多行。

以下代码在 C 语言中完全有效。一行代码中包含多个语句 -

int a=10; if (a>=50) printf("pass"); else printf("fail");

即使语句跨越多行,以下代码仍然有效 -

if
   (a>=50)
   printf("pass");
else printf("fail");

C 语言中的注释

注释就像 C 程序中的帮助文本,会被编译器忽略。它们以 /* 开头,以字符 */ 结尾,如下所示 -

/* 我的第一个 C 语言程序 */

注释中不能包含注释,注释也不能出现在字符串或字符字面量中。

源代码

C 程序是一个文本文件,包含一系列语句。该文件必须以 .c 作为扩展名。C 编译器在编译过程中仅识别 .c 文件。 C 语言的关键字和其他标识符仅使用英文字母,但字符串字面值可以包含任何 Unicode 字符。

main() 函数

每个 C 程序必须有一个(且只有一个)main() 函数,编译器从该函数开始执行代码。但是,main() 函数不必位于 .c 文件代码的开头。C 程序中可以有任意数量的函数。如果一个函数在其定义之前调用了任何其他函数,则应该对其进行前向声明。

头文件

除了关键字之外,C 程序通常还需要调用头文件库中的预定义函数。所需的头文件可以通过 #include 预处理器指令 导入。所有 #include 语句都必须位于源代码的开头。

变量声明

C 是一种静态类型语言。它要求程序中出现的所有变量在使用前必须声明。变量可以全局声明,即在任何函数之外,也可以在函数的作用域内局部声明。变量只能存储其声明类型的值。这是 C 语言的重要规则之一。

C 程序中的语句

语句是程序的基本构建块。main() 函数中的语句默认按从上到下的顺序执行。该顺序由条件语句循环结构控制。作为一项基本语法规则,每个语句末尾都必须有分号 (;)。

C 程序中的空格

在编译源代码时,编译器会忽略空格。空格是 C 语言中用来描述空格、制表符、换行符和注释的术语。虽然使用空格可以提高代码的可读性,但它们对编译器来说意义不大(除非它们是字符串字面量的一部分,出现在双引号内)。仅包含空格(可能带有注释)的行称为空行,C 编译器会完全忽略它。

空格将语句的各个部分分隔开,并使编译器能够识别语句中一个元素(例如 int)的结束位置和下一个元素的开始位置。因此,在以下语句中 -

int age;

int 和 age 之间必须至少有一个空格(通常为空格),以便编译器能够区分它们。另一方面,在以下语句中 -

fruit = apples + oranges; // 获取水果总数

"fruit"和"="之间以及"="和"apples"之间不需要空格,但如果您想提高可读性,可以随意添加一些空格。

C 语言中的复合语句

通常,您需要将一个内聚的语句块定义为一个编程逻辑单元。例如,您可能希望在某个逻辑表达式为真时执行多个语句,或者在循环块中执行多个语句。类似地,用户定义函数可能包含多个语句。在这种情况下,语句会被组合在一起形成复合语句。C 语言使用花括号进行这种组合。

{
   Statement1;
   Statement2;
   . . . 
   . . . 
}

在下面的代码中,if 和 else 部分各有一个语句块。

int marks = 40;

if (marks<50) {
   printf("Result: Fail
");
   printf ("Better Luck next time");
}
else {
   printf("Result: Pass
");
   printf("Congratulations");
}

函数定义中也使用花括号:

float area_of_square(float side) {
   float area = pow(side,2);
   return area;
}

使用 structunion 或 enum 定义自定义类型也需要使用花括号将多个语句组合在一起。

struct student {   	
   char name[20];   	
   int marks, age;   
};

花括号也声明了一个数组,如下所示 -

int marks[ ]={50,56,76,67,43};