C语言常见概念


前言

C语言是一门古老而强大的编程语言,是计算机科学领域最重要的基石之一。无论是操作系统、嵌入式设备,还是各类底层软件,都离不开C语言的支撑。
本文将从C语言的基本概念入手,帮助读者建立对这门语言的初步认识,为后续深入学习打下坚实的基础。

一、c语言是什么

c语言是一种计算机语言,人们通过计算机语言给计算机下达指令,计算机得以工作运行。

二、编译器及集成开发环境

编译器是C语言开发中不可或缺的核心工具。它的作用是把我们编写的C语言源代码(.c文件)翻译成计算机能够直接执行的机器指令,从而让程序真正运行起来。

简单来说,编译器就像一位「翻译官」:我们人类用接近自然语言的C语言写代码,而计算机只认识由0和1组成的机器码,编译器负责在两者之间完成转换。

常见的C语言编译器有 GCC、Clang 和 MSVC 等,它们都是把C语言代码变成可运行程序的得力工具。

集成开发环境(IDE,Integrated Development Environment)是把编写代码所需的多种工具整合在一起的软件,通常包含代码编辑器、编译器、调试器等核心组件,让开发者在一个界面里就能完成从写代码到运行程序的全部工作。

简单来说,IDE 就像一间「装修好的厨房」:锅碗瓢盆、炉灶、食材都摆放整齐,你只需要专注于做菜,而不必到处找工具。同理,使用 IDE 写 C 语言时,不需要手动打开多个软件来回切换。

常见的 C 语言集成开发环境有:

  • Visual Studio:微软出品,功能强大,Windows 平台下开发 C/C++ 的经典选择。
  • Code::Blocks:免费开源、轻量易用,非常适合初学者入门。
  • Dev-C++:界面简洁、上手快,常用于教学场景。
  • CLion:JetBrains 出品,功能全面,支持跨平台开发。
  • VS Code:轻量级编辑器,配合 C/C++ 插件后也能胜任 C 语言开发。

三、main 函数

在 C 语言中,main 函数是程序的入口点。无论代码写得多复杂,程序都是从 main 函数开始执行的。

一个最简单的 C 语言程序如下:

#include <stdio.h>

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

其中:

  • int main() 表示 main 函数返回一个整数,用来告诉操作系统程序是否正常结束。
  • printf 用于在屏幕上输出内容。
  • return 0; 表示程序正常结束,返回 0 给操作系统。

简单来说,main 函数就像一栋大楼的「大门」:无论楼里有多少房间,人们都必须从大门进入。同理,无论程序包含多少函数,运行时都从 main 函数开始。

四、printf 和库函数

在上一节的示例中,我们用到了 printf,它其实是 C 语言标准库提供的一个函数。所谓库函数,就是 C 语言标准库中预先封装好、可以直接调用的函数,能帮我们完成输入输出、字符串处理、数学计算等常见操作,而不必自己从零实现。

printf 是最常用的输出函数,作用是把内容格式化后输出到屏幕上。它的基本用法如下:

printf("格式字符串", 参数1, 参数2, ...);

其中格式字符串里的 %d%f%c 等称为格式占位符,用来指定后面参数以什么形式输出。例如:

#include <stdio.h>

int main() {
    int age = 18;
    printf("我今年 %d 岁\n", age);
    return 0;
}

运行结果会在屏幕上显示:我今年 18 岁。这里 %d 表示以整数形式输出 age 的值。

常见的格式占位符有:

  • %d:输出整数。
  • %f:输出小数(浮点数)。
  • %c:输出单个字符。
  • %s:输出字符串。

除了 printf,C 语言标准库还提供了许多常用库函数,例如:

  • scanf:从键盘读取输入。
  • strlen:计算字符串长度。
  • pow:计算幂次方。
  • sqrt:计算平方根。

简单来说,库函数就像「工具箱里的现成工具」:需要什么功能,直接拿来用即可,不必每次都自己动手造一个。而 printf 正是我们接触到的第一个库函数,也是后续调试程序时最常用的帮手。

五、关键字

在 C 语言中,关键字(也叫保留字)是语言本身预先定义好的、具有特殊含义的单词。它们不能被用作变量名、函数名等标识符,因为编译器已经为它们赋予了固定的用途。

简单来说,关键字就像「语言里的固定词汇」:每个词都有自己专属的含义和用法,我们不能随意改变它的意思,也不能拿它来当名字用。

C 语言标准规定了一组关键字,常见的有:

  • int:声明整数类型的变量。
  • char:声明字符类型的变量。
  • float:声明单精度浮点数(小数)类型的变量。
  • double:声明双精度浮点数类型的变量。
  • void:表示无类型,常用于函数没有返回值时。
  • if / else:用于条件判断。
  • for / while / do:用于循环。
  • return:从函数中返回一个值。
  • break:跳出当前循环或 switch 语句。
  • continue:跳过本次循环的剩余部分,进入下一次循环。
  • const:声明一个只读的常量。
  • sizeof:计算某个类型或变量所占的字节数。

例如,前面代码中用到的 intreturn 都是关键字:

#include <stdio.h>

int main() {
    int age = 18;      // int 是关键字,表示整数类型
    printf("我今年 %d 岁\n", age);
    return 0;          // return 是关键字,表示返回
}

需要注意的是,关键字是不能作为变量名的。比如下面这种写法就是错误的:

int int = 10;   // 错误!int 是关键字,不能用作变量名

简单来说,关键字是 C 语言语法的基础组成部分,理解它们能帮助我们写出更规范、更不容易出错的代码。随着学习的深入,我们会逐渐接触到更多关键字。

六、字符与 ASCII 表

在 C 语言中,字符是用单引号括起来的单个符号,例如 'A''0''#'。字符在内存中并不是直接存储符号本身,而是存储一个对应的整数编码,这个编码就是 ASCII 码。

简单来说,ASCII 表就像「字符与数字之间的对照字典」:计算机只认识数字,于是人们约定用 0~127 的整数来代表常见的字符,这样字符就能被存储和传输了。

下面给出 0~127 的完整 ASCII 表,方便查阅:

十进制 字符 十进制 字符 十进制 字符 十进制 字符
0 NUL(空) 32 空格 64 @ 96 `
1 SOH(标题开始) 33 ! 65 A 97 a
2 STX(正文开始) 34 " 66 B 98 b
3 ETX(正文结束) 35 # 67 C 99 c
4 EOT(传输结束) 36 $ 68 D 100 d
5 ENQ(询问) 37 % 69 E 101 e
6 ACK(确认) 38 & 70 F 102 f
7 BEL(响铃) 39 71 G 103 g
8 BS(退格) 40 ( 72 H 104 h
9 TAB(制表符) 41 ) 73 I 105 i
10 LF(换行) 42 * 74 J 106 j
11 VT(垂直制表) 43 + 75 K 107 k
12 FF(换页) 44 , 76 L 108 l
13 CR(回车) 45 - 77 M 109 m
14 SO(移出) 46 . 78 N 110 n
15 SI(移入) 47 / 79 O 111 o
16 DLE(数据链路转义) 48 0 80 P 112 p
17 DC1(设备控制1) 49 1 81 Q 113 q
18 DC2(设备控制2) 50 2 82 R 114 r
19 DC3(设备控制3) 51 3 83 S 115 s
20 DC4(设备控制4) 52 4 84 T 116 t
21 NAK(否定应答) 53 5 85 U 117 u
22 SYN(同步空闲) 54 6 86 V 118 v
23 ETB(传输块结束) 55 7 87 W 119 w
24 CAN(取消) 56 8 88 X 120 x
25 EM(介质结束) 57 9 89 Y 121 y
26 SUB(替换) 58 : 90 Z 122 z
27 ESC(退出) 59 ; 91 [ 123 {
28 FS(文件分隔符) 60 < 92 \ 124 |
29 GS(组分隔符) 61 = 93 ] 125 }
30 RS(记录分隔符) 62 > 94 ^ 126 ~
31 US(单元分隔符) 63 ? 95 _ 127 DEL(删除)

字符 A~Z 的ASCII码值从65~90
• 字符 a~z 的ASCII码值从97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是32
• 换⾏ \n 的ASCII值是:10
• 在这些字符中ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察

七、转义字符

在 C 语言中,转义字符是以反斜杠 \ 开头的特殊字符序列,用来表示那些无法直接书写或难以显示的字符,比如换行、制表符、引号等。转义字符虽然由多个字符组成,但在程序中它代表一个字符。

简单来说,转义字符就像「键盘上按不出来的按键」:我们没法直接在代码里敲一个回车,于是就用 \n 来表示换行;没法在字符串里直接写双引号,就用 \" 来表示双引号。

C 语言中常见的转义字符如下:

转义字符 含义 ASCII 码值
\n 换行 10
\t 水平制表符(Tab) 9
\r 回车 13
\b 退格 8
\a 响铃 7
\\ 反斜杠 \ 92
\' 单引号 ' 39
\" 双引号 " 34
\0 空字符(字符串结束标志) 0

例如,前面代码中 printf("Hello, World!\n") 里的 \n 就是一个转义字符,它让输出在显示完内容后自动换到下一行:

#include <stdio.h>

int main() {
    printf("第一行\n第二行\n");
    return 0;
}

运行结果:

第一行
第二行

再比如,想在屏幕上输出一个双引号,不能直接写在字符串里,而要使用 \"

#include <stdio.h>

int main() {
    printf("他说:\"你好!\"\n");
    return 0;
}

运行结果:

他说:"你好!"

需要注意的是,转义字符 \n 的 ASCII 码值是 10,正好对应上一节 ASCII 表中的 LF(换行);\t 对应 9(TAB),\0 对应 0(NUL)。所以转义字符本质上就是 ASCII 表中某些控制字符的「快捷写法」。

简单来说,转义字符是 C 语言中非常实用的语法,掌握它们能让我们更灵活地控制输出格式,也能避免在字符串中使用引号、反斜杠时出错。

八、语句分类

在 C 语言中,程序是由一条条语句组成的。所谓语句,就是一条完整的、以分号 ; 结尾的指令,它告诉计算机去执行某个具体的操作。C 语言的语句主要可以分为以下几类:

1. 表达式语句

表达式语句是最常见的语句,它由一个表达式加上分号组成,作用是计算表达式的值并产生副作用。例如:

age = 18;        // 赋值语句,把 18 赋给变量 age
age++;           // 自增语句,让 age 的值加 1
printf("你好");   // 函数调用语句,调用 printf 输出内容

简单来说,表达式语句就像「一句完整的吩咐」:先算出结果,再执行对应的动作,最后用分号收尾。

2. 空语句

空语句就是只有一个分号 ;,它不执行任何操作。空语句通常用在语法上必须有一条语句、但实际不需要做任何事的地方。例如:

while (condition)
    ;   // 空语句,循环体什么都不做,只等待条件变化

简单来说,空语句就像「占个位置」:语法上需要一条语句,但这里暂时不需要执行任何操作。

3. 复合语句(语句块)

复合语句也叫语句块,是用一对花括号 { } 把多条语句括起来,在语法上当作一条语句来使用。例如:

{
    int a = 10;
    int b = 20;
    printf("%d\n", a + b);
}

简单来说,复合语句就像「一盒打包好的工具」:把多条语句装进一个盒子里,需要时整体使用,逻辑也更清晰。

4. 控制语句

控制语句用来控制程序的执行流程,让程序能够根据条件做出判断或重复执行某段代码。C 语言的控制语句主要分为三类:

  • 条件判断语句ifelseswitch,根据条件是否成立决定执行哪段代码。
  • 循环语句forwhiledo...while,让某段代码重复执行。
  • 跳转语句breakcontinuegotoreturn,改变程序的执行顺序。

例如:

if (age >= 18) {
    printf("成年\n");
} else {
    printf("未成年\n");
}

简单来说,控制语句就像「十字路口的红绿灯」:它决定程序下一步往哪个方向走,是继续、跳过还是停下来。

5. 返回语句

返回语句 return 用于从函数中返回一个值,并结束当前函数的执行。例如:

int add(int x, int y) {
    return x + y;   // 返回 x 和 y 的和
}

简单来说,返回语句就像「交作业」:函数做完事情后,把结果交回去,同时结束这次调用。

小结

C 语言的语句可以归纳为下表:

语句类型 作用 示例
表达式语句 计算并执行操作 age = 18;
空语句 不执行任何操作 ;
复合语句 { } 组合多条语句 { ... }
控制语句 控制程序执行流程 ifforwhile
返回语句 从函数返回并结束 return 0;

简单来说,语句是构成 C 语言程序的基本单位,理解语句的分类能帮助我们更清晰地读懂代码结构,也为后续学习函数、流程控制等内容打下基础。

九、注释

在 C 语言中,注释是用来对代码进行解释和说明的文字。注释不会被编译器编译,也不会影响程序的运行结果,它只是写给看的,用来帮助阅读者理解代码的含义。

简单来说,注释就像「书本上的批注」:正文是给计算机执行的代码,而批注是给读者看的说明,两者互不干扰。

1. 注释的作用

注释主要有以下几个作用:

  • 解释代码意图:说明某段代码「为什么这样写」,而不只是「写了什么」。
  • 提高可读性:让代码更容易被自己和他人理解,尤其是过一段时间再回来看时。
  • 方便团队协作:别人接手你的代码时,能通过注释快速了解设计思路。
  • 临时屏蔽代码:把暂时不需要执行的代码注释掉,调试时非常方便。

例如:

#include <stdio.h>

int main() {
    // 定义一个变量 age,用来保存年龄
    int age = 18;

    // 输出年龄
    printf("我今年 %d 岁\n", age);

    return 0;
}

简单来说,注释是代码的「说明书」:它不参与运行,却能让代码更清晰、更易维护。

2. 注释的两种写法

C 语言支持两种注释方式:

  • 单行注释:以 // 开头,注释内容到本行末尾结束。
  • 多行注释:以 /* 开头、*/ 结尾,可以跨越多行。

例如:

// 这是单行注释,只能写一行

/*
   这是多行注释
   可以写很多行
*/

需要注意的是,多行注释不能嵌套使用,也就是说不能在 /* */ 里面再写一个 /* */

简单来说,单行注释适合写简短的说明,多行注释适合写较长的解释或临时屏蔽大段代码。

3. 注释的注意事项

  • 注释要简洁明了,不要写废话,否则反而会干扰阅读。
  • 注释应该解释「为什么」,而不是重复代码本身已经表达的内容。
  • 代码更新后,注释也要同步更新,避免注释和代码不一致。

简单来说,好的注释是「恰到好处的提示」,而不是「啰嗦的噪音」。养成写注释的好习惯,会让你的代码更专业、更受欢迎。

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了C语言的一些常见概念,帮助大家为更深入的 c语言学习打下基础。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐