一、什么是C语言?
C语言是一种通用的、面向过程的计算机程序设计语言,它由丹尼斯·里奇(Dennis Ritchie)在1972年设计,并在贝尔实验室开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。
1.C语言的特点
C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试。C语言的处理和表现能力都非常的强大,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作。因此,C语言既能够用于开发系统程序,也可用于开发应用软件。
2.C语言的应用
C语言广泛应用于底层开发,包括操作系统、嵌入式系统、设备驱动程序、游戏开发等领域。由于其高效性和灵活性,C语言在系统软件开发中占有重要地位。此外,C语言也是许多其他编程语言的基础,例如C++、Objective-C、C#等。
3.C语言的发展
C语言自诞生以来经历了多次更新和标准化。最新的C语言标准是C23,它在2022年9月3日由ISO发布。C23标准没有引入新的语言特性,而是对C11进行了补充与修正。
二、C语言的基本格式
#include<stdio.h>
int main()
{
printf("HelloWorld!\n");
return 0;
}
1.include <stdio.h> 是C语言程序中的一个预处理指令,用于包含标准输入输出库(Standard Input/Output Library)的头文件。`stdio.h` 是C语言标准库中的一个头文件,提供了用于处理输入输出的函数和宏定义。当你在C程序中写下 `#include <stdio.h>` 时,预处理器会在编译之前将 `stdio.h` 的内容插入到你的程序中。这样,你就可以使用该头文件中声明的函数,例如 `printf()` 和 `scanf()`,来进行屏幕输出和键盘输入。
2.int main()是C语言中程序的入口。每个C语言程序都必须有一个main()函数,因为操作系统会从这个函数开始执行程序。
3.printf是C语言中的一个标准库函数,用于将格式化后的字符串输出到标准输出设备,通常是屏幕。它是一个变参函数,意味着它可以接受不定数量的参数。printf函数的基本用法是通过一个格式化字符串来控制输出的格式,格式化字符串包含了一系列的格式说明符,这些说明符决定了如何将后续的参数转换为字符串并输出。
4.return 0通常用在main()函数中,作为程序执行的最后一步,它向操作系统返回一个整数值,表示程序的退出状态。
三、数据类型
char | 字符数据类型 | 1字节 |
short | 短整型 | 2字节 |
int | 整型 | 4字节 |
long | 长整型 | 4字节 |
long long | 更长的整型 | 8字节 |
float | 单精度浮点数 | 4字节 |
double | 双精度浮点数 | 8字节 |
每种数据类型的大小可以由以下代码获得:
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
sizeof运算符用于获得相关数据类型或表达式的长度。
运行结果 如下:
注意:1byte(字节)=8bit (比特)
一个字节能存放的最大数为(2^31-1)
四、常量与变量
1.常量:是在程序执行期间不会改变的值,也称为字面量。常量的值在程序运行之前初始化一次,之后就不会再变化。如性别、圆周率等。在C语言中,实现常量的方式主要有以下几种:
宏定义:使用 `#define` 预处理器指令来定义常量,例如 `#define PI 3.14159`。
const关键字:使用 `const` 关键字来定义常量,例如 `const float pi = 3.14159f;`。
枚举常量:使用 `enum` 关键字来定义常量,例如 `enum {ONE=1, TWO=2};`。
变量:是程序执行期间可以改变的值。变量在声明时通常需要初始化,以便在程序运行时能够存储数据。如年龄、体重等。变量的声明包括类型和名称,例如 `int count;` 声明了一个整型变量 `count`。
变量和常量的区别:
- 可变性:变量的值可以改变,而常量的值在初始化后就不能改变。
- 初始化:变量可以在声明时不初始化,而常量必须在声明时初始化。
- 存储位置:变量通常存储在内存中,其值可以被程序修改;常量可能存储在只读内存区域,以确保其值不会被意外修改。
- 命名约定:常量通常使用全大写字母命名,而变量通常使用小写字母或驼峰命名法。
使用建议:
- 在声明常量时,优先考虑使用 `const` 关键字,因为它提供了类型安全和更好的调试信息。
- 在声明变量时,应立即初始化,除非有合理的理由延迟初始化。
- 避免在程序中随意更改常量的值,以保持代码的稳定性和可预测性。
2.变量的分类:
全局变量:全局变量是在函数外部定义的变量,其作用域是整个程序,即从定义处到程序的末尾。即定义在main函数之外的变量
局部变量:也称为自动变量,是在函数内部定义的变量。它们的作用域仅限于定义它们的函数内,当函数执行完毕后,这些变量所占用的内存空间将被释放。局部变量在每次函数调用时都会被重新分配内存空间,并在函数返回时自动销毁。即定义在main函数内的变量。
#include<stdio.h>
int a=10;//全局变量
int main()
{
int b=100;//局部变量
return 0;
}
注意:当全局变量和局部变量的名字相同的情况下,局部优先,一般不建议取相同的名字,不便于区分且当两者同时存在时,编译器无法识别。
#include<stdio.h>
int a=10;//全局变量
int main()
{
int a=100;//局部变量
printf("a=%d\n",a);
return 0;
}
如此代码,当全局变量和局部变量相同时,编译器无法识别你要打印的a是10还是100,此时就会采取局部优先。
五、字符串+转义字符+注释
1.字符串:C语言中,字符串是由一系列字符组成的,这些字符以空字符(null terminator,'\0')结尾。C语言中没有专门的字符串类型,通常使用字符数组来表示字符串。
#include<stdio.h>
int main()
{
char arr[]="abcdef";
return 0;
}
通过VS编译器的调试监视可以发现该字符串的长度为7,arr是一个字符数组,它包含了符'a','b','c','d','e','f',以及一个空字符\0。在 C语言中,\0是一个空字符,用于表示字符串的结束,这意味着在处理字符串时,函数会一直取读字符,直到遇到\0为止。
2.转义字符:在C语言中,转义字符是一种特殊的字符序列,它们以反斜杠 `\` 开头,并且在输出时会被替换成特定的字符或操作。转义字符用于表示那些用一般字符不便于表示的控制代码,以及一些特殊字符。以下是一些常见的转义字符及其含义:
\n | 换行符,将当前位置移到下一行开头 |
\t | 水平制表符,将当前位置移动到下一个TAB位置 |
\b | 退格符,将当前位置移到前一列 |
\r | 回车符,将当前位置移到本行开头 |
\f | 换页符,将当前位置移到下页开头 |
\' | 单引号字符 |
\'' | 双引号字符 |
\\ | 反斜杠字符 |
\0 | 空字符(NULL),值为0,用于字符串的结束标记 |
\a | 响铃字符 |
\v | 垂直制表符 |
此外,C语言还支持使用八进制和十六进制来表示字符。八进制转义字符由反斜杠 `\` 后跟1到3位八进制数字组成,例如 `\141` 表示字符 'a'。十六进制转义字符由反斜杠 `\` 后跟字母 `x` 或 `X` 后跟1到2位十六进制数字组成,例如 `\x61` 也表示字符 'a'。
使用转义字符时需要注意,它们必须正确地配对,否则可能会导致编译错误或预期之外的行为。例如,在字符串中,如果需要表示反斜杠字符本身,就需要使用 `\\` 来进行转义。同样,如果需要在字符串中包含单引号或双引号,也需要使用 `\'` 或 `\"` 来进行转义,以防止字符串提前结束。
3.注释:在C语言中,注释用于向代码添加说明或解释,帮助程序员理解代码的功能和作用。注释不会被编译器编译,因此对程序的运行没有任何影响。C语言支持两种类型的注释:
单行注释:单行注释以两个斜线 `//` 开头,直到该行结束的部分被视为单行注释内容,编译器会忽略这部分内容。例如:
```c
// 这是一个单行注释,不会被执行
int main(void) {
// 在这里声明一个主函数
}
多行注释:多行注释以 `/*` 开始,并以 `*/` 结束,其中间所有内容均被视为注释,同样不参与编译。需要注意的是,C语言的多行注释不能嵌套使用。例如:
```c
/*
这是一个多行注释,
可以跨越多行,
用来描述一段代码块的功能或逻辑
*/
int main(void) {
/*
主函数入口
printf("Hello, World!"); // 输出语句
*/
return 0;
}
注释的主要作用是提高代码的可读性和可维护性,方便开发者以及后来阅读代码的人理解代码的功能和实现细节。在实际编程中,良好的注释习惯能够极大地提升代码质量,因此建议在编写代码时养成适时、适度注释的良好习惯。