C 语言奇幻之旅 - 第03篇:C 语言基本语法

文章目录

    • 引言
    • 1. 程序结构:C 语言的骨架
      • 1.1 头文件引用
        • 1.1.1 头文件的类型
        • 1.1.2 `#include` 的工作原理
      • 1.2 main() 函数 - 程序的入口
        • 1.2.1 main() 函数的参数
        • 1.2.2 main() 函数的返回值
      • 1.3 一个简单的 C 程序示例
      • 1.4 注意事项
    • 2. 注释:代码的备忘录
      • 2.1 单行注释
      • 2.2 多行注释
      • 2.4 条件编译与伪注释
      • 2.5 注释的重要性
      • 2.6 注释的最佳实践
    • 3. 标识符与关键字:C 语言的词汇
      • 3.1 标识符 - 变量的名字
        • 3.1.1 定义与规则
        • 3.1.2 命名习惯
      • 3.2 关键字 - C 语言的关键字
      • 3.3 标识符与关键字的区别
    • 4. 总结
    • 5. 练习

引言

‌‌‌‌  亲爱的各位朋友,大家好!我是 凌云,欢迎来到 C 语言奇幻之旅的第 3 篇!如果你已经跟随前两天的内容,那么你应该已经对 C 语言有了初步的了解。今天,我们将深入探讨 C 语言的基本语法,包括程序结构、注释、标识符与关键字。这些内容看似基础,但却是你未来编写复杂程序的基石。我们将以生动有趣的方式,带你轻松掌握这些知识点。


1. 程序结构:C 语言的骨架

1.1 头文件引用

‌‌‌‌在 C 语言中,#include 是一个预处理指令,用于引入头文件。头文件包含了函数声明、宏定义等信息,是程序的重要组成部分。你可以把它想象成一个工具箱,里面装满了各种工具(函数和宏),通过包含头文件,我们可以在程序中使用这些预定义的函数和宏。。

#include  // 添加标准输入输出函数

上面的代码引入了标准输入输出库 stdio.h,它包含了 printfscanf 等常用函数的声明。有了这个头文件,你就可以在程序中使用这些函数了。

1.1.1 头文件的类型

C 语言中有两种类型的头文件:

  1. 系统头文件:这些头文件通常位于系统的标准库目录中,例如 等。使用尖括号 < > 来包含这些头文件。

    #include 
    
  2. 用户自定义头文件:这些头文件通常由程序员自己编写,用于组织代码和模块化程序。使用双引号 " " 来包含这些头文件。

    #include "myheader.h"
    
1.1.2 #include 的工作原理

当编译器遇到 #include 指令时,它会将指定的头文件内容插入到当前文件中。这个过程发生在编译之前,称为预处理阶段。通过这种方式,我们可以将代码分割成多个文件,便于管理和维护。
C 语言奇幻之旅 - 第03篇:C 语言基本语法_第1张图片

1.2 main() 函数 - 程序的入口

‌‌‌‌main() 函数是每个 C 程序的入口点。无论你的程序有多复杂,执行总是从 main() 函数开始。你可以把它想象成一个舞台,所有的表演(代码)都从这里开始。

1.2.1 main() 函数的参数

main() 函数可以带有两个参数:argcargvargc 表示命令行参数的数量,argv 是一个指向参数字符串数组的指针。

int main(int argc, char *argv[]) {
    for (int i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
    return 0;
}

在这个例子中,程序会打印出所有的命令行参数。例如,如果程序名为 myprogram,并且运行时输入 ./myprogram arg1 arg2,那么输出将是:

Argument 0: ./myprogram
Argument 1: arg1
Argument 2: arg2
1.2.2 main() 函数的返回值

main() 函数的返回值通常用于指示程序的执行状态。返回 0 表示程序成功执行,而非零值表示程序异常终止。这个返回值可以被操作系统或其他程序捕获,用于进一步处理。

int main() {
    // 模拟一个错误
    return 1;
}

在这个例子中,程序返回 1,表示程序异常终止。

1.3 一个简单的 C 程序示例

‌‌‌‌让我们来看一个简单的 C 程序,它包含了 #includemain() 函数:

#include 

int main() {
    printf("Hello, World!\n");
    return 0;
}

这个程序的功能非常简单:在屏幕上输出 “Hello, World!”。printfstdio.h 文件中定义的一个函数,用于格式化输出。

1.4 注意事项

  1. main() 的返回类型通常为 int,表示返回一个整数。
  2. 花括号 {} 用于定义函数体。
  3. return 0; 表示程序正常结束;非零值通常表示错误。

2. 注释:代码的备忘录

2.1 单行注释

‌‌‌‌单行注释以 // 开头,直到行尾为止。它用于对单行代码进行解释或说明。你可以把它想象成代码的备忘录,帮助你或其他人理解代码的意图。

// 这是一个单行注释
int a = 10; // 定义一个整数变量 a,并赋值为 10

2.2 多行注释

‌‌‌‌多行注释以 /* 开头,以 */ 结尾,可以跨越多行。它通常用于对一段代码进行详细的解释或注释掉暂时不需要执行的代码。

/*
这是一个多行注释
它可以跨越多行
*/
int b = 20; /* 定义一个整数变量 b,并赋值为 20 */

C 语言不支持嵌套的多行注释。如果在多行注释中再嵌套一个多行注释,编译器会报错。

/*
这是一个多行注释。
/* 这是一个嵌套的多行注释 */
*/

在上面的代码中,嵌套的多行注释会导致编译错误。

2.4 条件编译与伪注释

‌‌‌‌虽然 #if 0#endif 不是真正的注释,但它们可以用来临时“注释掉”代码块,而不需要实际删除代码。当预处理器遇到 #if 0 指令时,它会跳过直到 #endif 之间的所有代码,不会将这些代码包含在编译后的程序中。这种方式常用于调试或者暂时禁用某段代码。

#if 0
    // 下面的代码块将不会被编译
    printf("这段代码不会被执行。\n");
    int unusedVariable = 42;
#endif

这种方法的一个优点是,如果将来需要重新启用这段代码,只需要移除 #if 0#endif,而不必重新输入被注释掉的代码。然而,使用 #if 0#endif 应该谨慎,因为这可能会导致代码难以阅读和维护。对于长时间不需要的代码,最好还是将其删除或妥善保存在版本控制系统中。

2.5 注释的重要性

‌‌‌‌注释是代码的重要组成部分,它不仅帮助他人理解你的代码,也帮助你在未来回顾代码时快速理解其逻辑。良好的注释习惯是优秀程序员的标志之一。

2.6 注释的最佳实践

  1. 保持注释简洁明了:注释应该简洁明了,避免冗长的解释。注释的目的是帮助理解代码,而不是重复代码的功能。

  2. 及时更新注释:当代码发生变化时,确保注释也相应更新。过时的注释可能会误导其他开发者。

  3. 避免过度注释:代码本身应该是自解释的。如果代码足够清晰,过多的注释反而会增加阅读负担。

3. 标识符与关键字:C 语言的词汇

3.1 标识符 - 变量的名字

3.1.1 定义与规则

标识符是C语言中用来命名变量、函数、数组、结构体等的符号。在编写C语言程序时,程序员需要遵循一定的规则来定义标识符:

  1. 标识符只能由字母(A-Z, a-z)、数字(0-9)和下划线 _ 组成。
  2. 标识符的第一个字符不能是数字。
  3. 标识符区分大小写,即MyVarmyvar被视为两个不同的标识符。
  4. 标识符不能是C语言的关键字。
  5. 虽然理论上标识符可以无限长,但ANSI标准规定编译器至少能识别前31个字符。不过,许多现代编译器支持更长的名称。
3.1.2 命名习惯

为了提高代码的可读性和可维护性,通常会采用一些命名习惯或约定,例如:

  • 使用有意义的名字,如 counter 而不是 x
  • 对于常量,使用全大写字母,单词间用下划线分隔,如 MAX_SIZE
  • 函数和变量名通常使用小写字母,多个单词通过驼峰命名法(CamelCase)或者下划线连接。
  • 类型名通常使用首字母大写的驼峰命名法。
int myVar;
float _value;
char str1[10];

而以下是一些非法的标识符:

int 1var;    // 不能以数字开头
float my-var; // 不能包含减号
char return; // 不能使用关键字

3.2 关键字 - C 语言的关键字

‌‌‌‌关键字是在C语言中有特殊含义并且被保留使用的单词。它们用于定义程序的结构和控制语句,并且每个关键字都有特定的语法和用途。因为关键字有特殊的含义,所以它们不能作为普通标识符使用。保留字是未来可能成为关键字的单词,目前尚未使用,但应避免用作标识符。

以下是 C 语言的关键字和保留字列表,按照类别排序,并附上解释说明:

类别 关键字/保留字 解释说明
数据类型 int 用于声明整数类型变量。
char 用于声明字符类型变量。
float 用于声明单精度浮点数类型变量。
double 用于声明双精度浮点数类型变量。
void 表示“无类型”,通常用于函数返回值或指针类型。
short 用于声明短整数类型变量,通常占用较少内存。
long 用于声明长整数类型变量,通常占用较多内存。
signed 用于声明有符号类型变量(默认情况下,intchar 等是有符号的)。
unsigned 用于声明无符号类型变量,表示非负数。
存储类别 auto 用于声明自动变量(默认存储类别,通常省略)。
static 用于声明静态变量或函数,表示其生命周期为整个程序运行期间。
extern 用于声明外部变量或函数,表示其定义在其他文件中。
register 用于建议编译器将变量存储在寄存器中,以提高访问速度。
控制语句 if 用于条件判断,执行条件为真时的代码块。
else if 配合使用,执行条件为假时的代码块。
switch 用于多分支选择,根据表达式的值跳转到不同的 case 分支。
case switch 配合使用,定义分支条件。
default switch 配合使用,定义默认分支(当所有 case 都不匹配时执行)。
for 用于循环结构,通常用于已知循环次数的场景。
while 用于循环结构,当条件为真时重复执行代码块。
do while 配合使用,先执行代码块,再判断条件是否为真。
break 用于跳出循环或 switch 语句。
continue 用于跳过当前循环的剩余部分,直接进入下一次循环。
return 用于从函数中返回值并结束函数执行。
goto 用于无条件跳转到指定标签(不推荐使用,容易导致代码混乱)。
类型修饰符 const 用于声明常量,表示变量的值不可修改。
volatile 用于声明易变变量,表示变量的值可能被外部因素改变,编译器不应优化。
其他关键字 sizeof 用于获取变量或数据类型的大小(以字节为单位)。
typedef 用于为数据类型定义别名,简化复杂类型的声明。
保留字 _Bool C99 标准引入的布尔类型关键字,表示真(true)或假(false)。
_Complex C99 标准引入的复数类型关键字。
_Imaginary C99 标准引入的虚数类型关键字。
inline 用于建议编译器将函数内联展开,以减少函数调用的开销。
restrict 用于指针声明,表示指针是访问某个内存区域的唯一方式(C99 标准引入)。

3.3 标识符与关键字的区别

‌‌‌‌标识符是程序员定义的名称,用于变量、函数、结构体等,需遵循命名规则(如以字母或下划线开头,不能与关键字冲突)。关键字是编程语言预留的具有特定功能的单词,如iffor等,不能用作标识符。简而言之,标识符由程序员自定义,关键字由语言定义并具有固定用途。

例如,int 是一个关键字,用于声明整型变量,而 myVar 是一个标识符,用于命名一个变量。

4. 总结

今天,我们深入探讨了 C 语言的基本语法,包括程序结构、注释、标识符与关键字。通过详细的解释和丰富的代码示例,你应该已经掌握了这些基础概念。无论是初学者、中级开发者还是资深开发者,理解这些基本语法都是编写高效、可维护代码的关键。

  • 程序结构#include 用于引入头文件,main() 函数是程序的入口。
  • 注释:单行注释以 // 开头,多行注释以 /* 开头,以 */ 结尾。
  • 标识符与关键字:标识符是程序员定义的名称,关键字是 C 语言的保留字。

在接下来的博客中,我们将继续探索 C 语言的更多高级特性,包括数据类型、运算符、控制结构等。希望你能继续关注,并在学习过程中不断实践和提升自己的编程技能。

5. 练习

为了巩固今天的学习内容,你可以尝试以下练习:

  1. 编写一个简单的 C 程序,使用 #include 包含 头文件,并在 main() 函数中输出 “Hello, World!”。

  2. 尝试在程序中使用单行注释和多行注释,解释代码的功能。

  3. 定义一个标识符,并尝试使用不同的命名规范(如小写字母、下划线分隔、驼峰命名法等)。

  4. 编写一个程序,使用 ifelse 关键字进行条件判断,并输出不同的结果。

通过这些练习,你将能够更好地理解和应用今天所学的知识。祝你编程愉快!


希望这篇博客能为你提供有价值的信息,并激发你对 C 语言学习的兴趣。如果有任何问题或建议,欢迎随时告诉我!


上一篇:第03篇:C 语言基本语法
下一篇:第04篇:C 语言数据类型与变量

你可能感兴趣的:(C,语言奇幻之旅,c语言,开发语言,windows,个人开发,物联网)