- 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 - 指针与数组的区别
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 野指针
- C - 解引用指针
- C - 近指针、远指针和巨指针
- C - 指针数组的初始化
- C - 指针与多维数组的区别
- C 语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C 语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (enum)
- C - 结构体填充和压缩
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - typedef
- C 语言中的文件处理
- C - 输入/输出
- C - 文件 I/O (文件处理)
- C 预处理器
- C - 预处理器
- 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 program*/ // Comments
#include <stdio.h> // Header File
int a=10; // Global declarations
// The main function
int main() {
char message[] = "Hello World"; // Local variable
printf("%s", message);
return 0;
}
C 语言中的词法单元
C 程序由各种 词法单元 组成,一个词法单元可以是关键字、标识符、常量、字符串字面量或符号。例如,以下 C 语句包含五个词法单元:
printf("Hello, World! \n");
各个词法单元是:
printf ( "Hello, World! \n" );
C 编译器 会识别词法单元是关键字、标识符、注释、字面量、运算符,还是任何其他已识别的特殊符号。这个过程由编译过程的第一阶段中的词法分析器完成。
C 语言中的标识符
C 标识符 是用于标识变量、函数或任何其他用户定义项的名称。标识符以字母 A 到 Z、a 到 z 或下划线 '_' 开头,后跟零个或多个字母、下划线和数字 (0 到 9)。
C 语言规定了形成变量、函数或其他编程元素名称的某些规则。它们不是关键字。标识符必须以字母或下划线开头,并且除了字母、数字和下划线之外,不能包含任何其他字符。
C 语言不允许在标识符中使用诸如 @、$ 和 % 等标点符号。C 语言是区分大小写的编程语言。因此,Manpower 和 manpower 在 C 语言中是两个不同的标识符。以下是一些可接受的标识符示例:
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! \n");
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 程序中的辅助文本,编译器会忽略它们。它们以 /* 开头,以 */ 结尾,如下所示:
/* my first program in C */
注释中不能嵌套注释,并且它们不会出现在字符串或字符字面量中。
源代码
C 程序是一个文本文件,包含一系列语句。该文件必须以 .c 为扩展名。C 编译器只识别 .c 文件进行编译。虽然字符串字面量可以包含任何 Unicode 字符,但 C 语言的关键字和其他标识符只使用英文字母。
main() 函数
每个 C 程序都必须有一个(且只有一个)main() 函数,编译器从这里开始执行代码。但是,main() 函数不必位于 .c 文件代码的开头。C 程序中可以有任意数量的函数。如果一个函数在其定义之前调用任何其他函数,则应该对其进行前向声明。
头文件
除了关键字之外,C 程序通常还需要从头文件库中调用预定义函数。所需的 头文件使用 #include 预处理器指令 导入。所有 #include 语句都必须位于源代码的开头。
变量声明
C 语言是一种静态类型语言。它要求在使用程序中出现的变量之前对其进行声明。变量可以在全局范围内(即在任何函数之外)或在函数的作用域内局部声明。变量只能存储其声明类型的变量。这是 C 语言的重要规则之一。
C 程序中的语句
语句是程序的基本组成部分。默认情况下,`main()` 函数中的语句按从上到下的顺序执行。顺序由条件语句或循环结构控制。作为基本语法规则,每个语句结尾必须有分号 (;)。
C程序中的空白字符
编译源代码时,编译器会忽略空白字符。在C语言中,空白字符是指空格、制表符、换行符和注释。虽然可以使用它们来提高代码的可读性,但它们对编译器几乎没有意义(除非它们是字符串字面量的一部分,出现在双引号内)。仅包含空白字符(可能还有注释)的行被称为空行,C编译器会完全忽略它。
空白字符将语句的一个部分与另一个部分隔开,并使编译器能够识别语句中一个元素(例如 int)的结束位置和下一个元素的开始位置。因此,在以下语句中:
int age;
为了使编译器能够区分 `int` 和 `age`,`int` 和 `age` 之间必须至少有一个空白字符(通常是一个空格)。另一方面,在以下语句中:
fruit = apples + oranges; // get the total fruit
“fruit”和“=”之间,或“=”和“apples”之间不需要空白字符,尽管您可以随意添加一些以提高可读性。
C语言中的复合语句
通常,您需要将一个连贯的语句块定义为单个编程逻辑单元。例如,如果某个逻辑表达式为真,您可能希望执行多个语句,或者在循环块中执行多个语句。同样,用户定义的函数可能包含多个语句。在这种情况下,语句被组合在一起形成复合语句。C语言使用花括号进行这种分组。
{
Statement1;
Statement2;
. . .
. . .
}
在以下代码中,if 和 else 部分各自包含一个语句块。
int marks = 40;
if (marks<50) {
printf("Result: Fail\n");
printf ("Better Luck next time");
}
else {
printf("Result: Pass\n");
printf("Congratulations");
}
花括号也用于函数定义
float area_of_square(float side) {
float area = pow(side,2);
return area;
}
使用结构体、联合体或枚举定义自定义类型也需要用花括号将多个语句组合在一起。
struct student {
char name[20];
int marks, age;
};
花括号还可以声明数组,如下所示:
int marks[ ]={50,56,76,67,43};