C语言基本概念

发布时间 2023-12-17 02:58:53作者: excellentFish

关于C语言

C语言是一种广泛使用的计算机编程语言,由丹尼斯·里奇(Dennis Ritchie)于1972年在贝尔实验室开发,主要用于重新实现Unix操作系统。它是一种高级语言,但它也提供了许多低级编程的功能如指针、位运算等。对后来的许多编程语言(如C++、C#、Java)产生了深远的影响,并被广泛应用于系统软件(如操作系统和编译器)、嵌入式系统、高性能计算等领域。

C程序中的基本元素

1. main()函数 与 其他函数

用法通常为

int main (void)
{

    return 0;
}

C程序一定从main函数开始,main函数在一个C程序中只有一个,它是程序的入口点,但并不需要在源码中写在首位。

除main函数外,其他函数均可在C程序的规则和限制范围内任意命名,主要限制有:
1.函数名只能使用字母(A-Z和a-z)、数字(0-9)和下划线(_)。函数名的第一个字符不能是数字。
2.大小写区分。
3.不能与关键字有所冲突,避免与标准库函数名冲突,全局函数名避免与局部作用域和其他函数域的变量或者函数名冲突

2. 注释

尽管注释在编程中不直接影响程序的功能,但也扮演着非常重要的角色。主要为了提高代码可读性,降低维护时间成本,标记待办事项,记录调试测试结果等重要作用,编程时不可忽视注释重要性。其主要分为C和C++两种风格

/*   这是C风格的注释
     可以多行注释
     这里是结束标记 →  */

//   这是C++风格注释
//   多行注释的话就要每行加//
int constant;  // 可以放在这里注释

3. 变量与声明(declare)与数据类型

变量分为全局变量与局部变量。全局变量好比共享单车,工程内任意地方,想用总有办法能用到。局部变量好比自家的单车,只有自家(其所属的大括号内)能用。
变量的创建 就是向内存去申请空间的,局部变量在栈区申请,全局变量在静态区申请。
img

int num;

如上操作称为声明,该操作有两个作用,其一为创建了一个名为num的变量,其二为通过关键字 int 表名了变量num类型为整数。声明也可用于声明函数的返回类型。如前面main函数的例子中对main函数的返回值声明为整数型,则返回时应要返回整数型的数据(return 0;)。

C程序中涉及的数据类型如下:

1.整型(Integer Types):

int:标准整数类型,通常用于存储整数值。
short:短整型,占用的内存小于或等于int。
long:长整型,占用的内存大于或等于int。
long long:更长的整型(C99标准引入),占用的内存大于或等于long。
unsigned修饰符可以应用于整型,表示无符号变量(只能存储正数和零)。

2.浮点型(Floating-Point Types):

float:单精度浮点数,用于存储小数。
double:双精度浮点数,比float有更大的范围和精度。
long double:扩展精度浮点数,比double有更大的范围和精度。

3.字符型(Character Type):

char:用于存储单个字符。在C语言中,字符实际上是以整数形式存储的。

4.布尔型(Boolean Type):

_Bool:布尔类型(C99标准引入),用于存储真(1)或假(0)值。
在包含stdbool.h头文件后,可以使用bool、true、false作为布尔值。

5.枚举类型(Enumeration Type):

enum:枚举类型,用于定义一组命名的整数常量。

6.空类型(Void Type):

void:表示无类型。用于指定没有返回值的函数或未指定类型的指针(void*)。

7.派生类型:

指针类型(Pointer Types):用于存储内存地址。
数组类型(Array Types):用于存储固定大小和类型相同的元素序列。
结构体类型(Struct Types):用于组合不同类型的数据。
联合体类型(Union Types):用于存储不同类型的数据,但在任何时候只能存储其中一种类型。
函数类型(Function Types):代表函数的返回类型和参数。

4. 头文件

头文件(通常以.h扩展名结尾)用于多种目的,主要包括:

1.函数声明:头文件常用于声明函数。这允许函数在多个源文件(.c文件)中被调用,而无需在每个源文件中重复函数的定义。这样做的好处是,当函数的定义改变时,只需修改其实现,而不必修改每个调用该函数的源文件。

2.宏定义:头文件经常用来定义宏(#define指令)。这些宏可以是常量(如#define PI 3.14159),也可以是宏函数。

3.类型定义:自定义数据类型(如结构体、联合体和枚举)的定义通常放在头文件中,以便在多个源文件中共享和重用。

4.全局变量声明:虽然在现代C编程实践中不鼓励使用全局变量,但头文件可以用来声明外部全局变量(使用extern关键字),这样这些变量就可以在多个源文件中访问。

5.条件编译:头文件常用于条件编译。预处理器指令(如#ifdef、#ifndef、#endif)可以用来确保头文件不会被重复包含,或者根据不同的编译环境包含不同的代码。

6.模板代码:在某些情况下,头文件用于包含可以在多个源文件中重用的模板代码。

7.库接口:当使用标准库或第三方库时,相关的头文件提供了库函数、类型和宏的声明,使得这些库能够被集成和使用在你的程序中。

如常用的头文件 stdio.h 为非常重要的标准库头文件,包含了输入和输出的函数和宏定义

又如常用的标准头文件 stdbool.h 定义了_Bool类型,即布尔型数据,而'true'和'false'则是定义为表示布尔真值和布尔假值的宏。

5. 转义字符

C语言中的转义字符用于表示那些不能直接在字符串或字符常量中表示的字符。这些转义字符都是以反斜杠 \ 开始的。以下是一些常用的C语言转义字符:

\n:换行符。将光标移动到下一行的开头。
\t:水平制表符(Tab)。用于在文本中创建水平空间。
\r:回车符。将光标移动到当前行的开头。
\:反斜杠。用于在字符串中表示一个反斜杠字符。
':单引号。用于在字符常量中表示单引号。
":双引号。用于在字符串常量中表示双引号。
\b:退格符。将光标向左移动一个位置。
\0:空字符(NULL)。用于表示字符串的结束。
\v:垂直制表符。用于在文本中创建垂直空间。
?:问号。用于在字符串中表示问号(主要用于避免与三字符序列的混淆)
\xhh:十六进制数。用于表示任意字符(其中 hh 是两位十六进制数)
\ooo:八进制数。用于表示任意字符(其中 ooo 是三位八进制数)

6. 占位符

占位符通常指的是在字符串格式化时用于指定特定类型值的位置的符号。在C语言中,这种概念经常出现在与printf或scanf函数相关的字符串格式化中。占位符以百分号(%)开始,后跟一个或多个指定格式的字符。

以下是一些C语言中常见的占位符:

%d 或 %i:用于格式化整数。
%u:用于格式化无符号整数。
%f:用于格式化浮点数(小数)。
%lf:用于格式化双精度浮点数。
%c:用于格式化单个字符。
%s:用于格式化字符串。
%p:用于格式化指针(输出内存地址),通常以十六进制形式显示。
%x 或 %X:用于以十六进制格式格式化无符号整数。
%o:用于以八进制格式格式化无符号整数。
%%:用于在字符串中输出百分号本身。

例如,在使用printf函数输出时,占位符用法如下:

int number = 10;
printf("The number is %d", number);

将会输出:

The number is 10
%d是一个占位符,它告诉printf函数在这个位置用number变量的值(一个整数)来替换%d。

C语言中的占位符不仅仅局限于基本的类型指示,还可以包含更详细的格式化选项。这些选项允许你控制输出的宽度、精度、对齐方式等。以下是一些常用的细化用法:

1.宽度指定:
%nd:这里的n是一个整数,用于指定输出的最小宽度。如果输出的数字位数少于n,则会在左侧填充空格(或其他指定的填充字符)以达到指定宽度。例如,%5d会保证输出的整数至少占用5个字符的宽度,不足部分用空格填充。

2.左对齐:
%-nd:在宽度指定符前加上负号-可以使输出左对齐。例如,%-5d会使整数左对齐,并保证至少占用5个字符的宽度。

3.精度指定:
%.nf:对于浮点数,n指定了小数点后的数字位数。例如,%.2f会使浮点数保留两位小数。
%.f:星号表示精度在运行时由另一个整数参数指定。例如,printf("%.*f", precision, number);。

4.填充零:
%0nd:在宽度指定符前加上0会用零而不是空格来填充额外的宽度。例如,%05d会在整数前面填充零以确保总宽度为5。

5.十六进制和八进制:
%x或%X:分别用于输出小写或大写的十六进制数。
%o:用于输出八进制数。

6.字符串宽度和精度:
%ns:输出的字符串至少占用n个字符的宽度。
%.ns:输出的字符串最多包含n个字符。

7. 关键字

在编程语言中,关键字(也称为保留字)是一些被语言赋予了特殊意义的单词。这些单词是语言的一部分,用于执行特定的语言功能,因此不能用作标识符(例如变量名、函数名等)。

在C语言中,一些常见的关键字包括:

int, char, float, double:基本数据类型。
if, else, switch, case:用于条件控制。
for, while, do:用于循环控制。
return:用于从函数返回值。
void:指明无类型或无返回值。
struct, union, enum:用于定义复合数据类型。
const, static, extern:用于指定变量的作用域和生命周期。
sizeof:用于获取数据类型或变量的大小。
break, continue:用于循环控制流程。

其余关键字可查阅cppreference了解:
https://zh.cppreference.com/w/c/keyword

本博客内容部分参考 ** C Primer Plus ** 、** ChatGPT **,如有纰漏,欢迎指正!