C语言基础知识梳理01丨C语言简介、程序结构、数据类型与运算符

C语言基础知识梳理

目录

第一章:C语言简介

第二章:C语言的程序结构

第三章:C语言基本数据类型

第四章:C语言运算符

第一章:C语言简介

1.1 C语言的起源和历史

C语言起源于20世纪70年代,由美国AT&T公司的贝尔实验室开发。其初衷是为了编写一个多任务、多用户的操作系统——Unix。C语言由Dennis M. Ritchie设计,并由Brian Kernighan编写了最早的C语言编译器。

C语言最初的设计灵感来源于Algol 60和Burroughs的大型机编程语言。它引入了结构化的编程元素,如函数、数据类型和运算符,使得代码更易于理解和维护。

随着时间的推移,C语言逐渐成为计算机科学领域最受欢迎的语言之一。它的跨平台性和高效性能使其在许多领域得到广泛应用,包括操作系统、嵌入式系统、游戏开发、科学计算等。

1.2 C语言的特点和应用领域

C语言的特点包括:

  1. 跨平台性:C语言编写的程序可以在不同的操作系统上运行,如Windows、Linux和Mac OS等。
  2. 高效性能:C语言具有高效的运行速度和内存管理,适用于需要高性能的应用程序。
  3. 结构化编程:C语言支持结构化编程,使得代码更易于理解和维护。
  4. 丰富的运算符和数据类型:C语言支持多种运算符和数据类型,包括指针、数组、结构体等,提供了强大的编程能力。
  5. 手动内存管理:C语言允许程序员直接管理内存,提供了更大的灵活性,但也要求程序员对内存管理有更深入的了解。

C语言的应用领域非常广泛,包括但不限于:

  1. 操作系统:Unix、Linux、Windows等操作系统的内核和相关工具大部分是用C语言编写的。
  2. 嵌入式系统:C语言广泛应用于嵌入式系统的开发,如智能家居设备、汽车电子等。
  3. 游戏开发:许多游戏引擎和游戏开发工具是用C语言编写的,如Unreal Engine和Source Engine等。
  4. 科学计算:C语言在科学计算领域得到了广泛应用,如数值计算、物理模拟等。
  5. 系统编程:C语言在系统编程方面表现出色,如网络编程、多线程编程等。

1.3 C语言与汇编语言的区别

C语言和汇编语言虽然都是计算机编程语言,但它们在许多方面存在显著差异。以下是它们之间的一些主要区别:

  1. 抽象级别:C语言是一种高级编程语言,它提供了更高级别的抽象,例如数据类型、函数、控制结构等。这使得C语言更易于学习和使用,并且减少了与硬件相关的编程复杂性。而汇编语言是一种低级语言,它直接与计算机硬件交互,每个汇编指令通常对应于一个机器指令。因此,汇编语言更难以编写和理解。
  2. 可移植性:由于C语言是一种高级语言,它的代码通常具有更好的可移植性。这意味着,用C语言编写的程序可以在不同的操作系统和硬件平台上运行,只要这些平台都支持C语言。相比之下,汇编语言的代码通常是特定于特定硬件平台的,移植性较差。
  3. 性能:虽然C语言是高级语言,但其性能通常优于汇编语言。这是因为C语言编译器可以将高级语言代码优化为高效的机器代码。尽管汇编语言直接与硬件交互,但在许多情况下,C语言的性能已经足够满足大多数应用程序的需求。
  4. 开发效率:由于C语言提供了高级抽象,使得开发效率更高。使用C语言,程序员可以专注于解决问题而不是与硬件细节打交道。而汇编语言需要程序员直接处理硬件细节,这通常会增加开发时间和复杂性。
  5. 维护性:使用高级语言如C编写的代码通常更易于阅读和维护。C语言的清晰语法和结构化特性使得代码易于理解,降低了长期维护的难度。相比之下,汇编语言的代码通常更为复杂和难以理解。

1.4 C语言与其他高级编程语言的区别

C语言与其他语言的区别主要体现在以下几个方面:

  1. 内存管理:C语言要求程序员手动管理内存,包括分配和释放内存。而其他一些高级语言,如Python和Java,提供了自动内存管理机制。
  2. 类型系统:C语言是静态类型的语言,这意味着在编译时类型是固定的。而动态类型的语言,如Python和JavaScript,可以在运行时改变变量的类型。
  3. 面向对象编程(OOP):虽然C语言本身不支持面向对象编程,但可以通过结构体和函数指针模拟类和对象。而像C++、Java和Python这样的语言则完全支持OOP。
  4. 安全性:C语言允许直接访问内存,这使得它具有很高的灵活性,但也更容易导致缓冲区溢出等安全问题。相比之下,一些更高级的语言提供了更安全的内存访问机制。
  5. 运行时性能:由于C语言是编译型语言,它在运行时的性能通常优于解释型语言,如Python和JavaScript。
  6. 语法:C语言的语法相对简单、清晰,使得它易于学习和使用。与其他一些语言相比,C语言的语法更接近于底层硬件操作。
  7. 库和框架支持:C语言的标准库相对较小,但它的强大之处在于其广泛的第三方库和框架支持,特别是在系统编程和科学计算领域。

C语言以其高效性能、底层访问能力和结构化编程风格而闻名。它适合开发需要高性能、低延迟的系统软件、嵌入式系统以及操作系统等。而其他一些高级语言更适合快速开发和原型设计,或者在需要更高级的编程范式(如面向对象编程)的场景中使用。因根据场景的不同选择合适的语言。

第二章:C语言的程序结构

2.1 C语言程序的组成

一个C语言程序通常由以下几个部分组成:

  1. 预处理器指令:预处理器指令以#开头,用于提供编译时的指令,如包含头文件、定义宏等。常见的预处理器指令包括#include和#define。
  2. 函数:函数是C语言的基本组成单位,用于执行特定的任务。C语言程序从main()函数开始执行。
  3. 变量和数据类型:C语言提供了多种数据类型,如整型、浮点型、字符型等,用于存储不同类型的数据。
  4. 控制结构:控制结构包括条件语句(如if-else)、循环语句(如for、while)等,用于控制程序的执行流程。
  5. 运算符:运算符用于执行算术运算、逻辑运算等操作。
  6. 注释:注释用于解释代码的作用和功能,提高代码的可读性。
  7. 头文件和源文件:头文件通常包含函数声明、宏定义等,而源文件包含程序的实现代码。

简单示例:

#include <stdio.h> // 预处理器指令,包含标准输入输出头文件

int main() // 主函数,程序的入口点
{
    int x = 5; // 声明并初始化整型变量x为5
    int y = 10; // 声明并初始化整型变量y为10
    int sum = x + y; // 声明整型变量sum,计算x和y的和,并将结果存储在sum中

    printf("The sum of %d and %d is %d\n", x, y, sum); // 输出x、y和它们的和

    return 0; // 主函数结束,返回0表示程序正常结束
}

这个程序使用了预处理器指令#include <stdio.h>来包含标准输入输出头文件,以便使用printf函数。
程序中定义了两个整型变量xy,并计算它们的和存储在变量sum中。
然后使用printf函数输出结果。
最后,程序通过返回语句结束,并返回0表示正常结束。
注释用于解释代码的作用和实现方式。

2.2 注释的写法

C语言中的注释有两种形式:

  1. 单行注释:使用//开头,注释从//开始直到该行结束。例如:
// 这是一个单行注释
int x = 10; // 这也是一个单行注释
  1. 多行注释:使用/**/包围,可以跨越多行。例如:
/* 这是一个多行注释
   可以跨越多行 */

2.3 主函数main()

每个C语言程序都必须有一个main()函数,它是程序的入口点。在下面的示例中,main()函数的返回类型是int,通常返回0表示程序正常结束。

#include <stdio.h>

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

2.4 头文件(Header Files)

头文件通常包含函数的声明、宏定义、类型定义等,用于提供给其他源文件引用。头文件以.h为扩展名,例如stdio.hstdlib.h等。当其他源文件需要使用某个函数的声明时,可以通过包含相应的头文件来引用。例如:

#include <stdio.h>  // 包含标准输入输出头文件,用于使用printf()函数

2.5 源文件(Source Files)

源文件是包含程序实现代码的文件。它通常包含函数的定义和实现、变量定义等。源文件以.c为扩展名,例如一个简单的C语言程序可以保存在一个名为main.c的源文件中。

第三章:C语言基本数据类型

3.1 整型(整数)

整型变量用于存储整数。根据不同的取值范围,整型可以分为短整型(short)、整型(int)和长整型(long)。

3.1.1 整型变量的声明与初始化

要声明一个整型变量,你需要使用int关键字,并为其分配一个变量名。例如:

int myInteger; // 声明一个整型变量myInteger

初始化整型变量就是在声明的同时为其赋值。例如:

int myInteger = 10; // 声明并初始化整型变量myInteger为10

3.1.2 整型常量的表示方法

整型常量是固定值的整数。在C语言中,整型常量可以用十进制、八进制或十六进制表示。例如:

int decimalConstant = 123; // 十进制表示的整型常量
int octalConstant = 0123; // 八进制表示的整型常量(以0开头)
int hexConstant = 0xABC; // 十六进制表示的整型常量(以0x或0X开头)

3.2 字符型(char)

字符型变量用于存储单个字符。在C语言中,字符常量是用单引号括起来的单个字符,例如’A’或’9’。

3.2.1 字符型变量的声明与初始化

要声明一个字符型变量,你需要使用char关键字,并为其分配一个变量名。例如:

char myChar; // 声明一个字符型变量myChar

初始化字符型变量就是在声明的同时为其赋值。例如:

char myChar = 'A'; // 声明并初始化字符型变量myChar为'A'

3.2.2 字符型常量的表示方法

字符型常量用单引号括起来,例如’A’或’9’。转义字符是特殊类型的字符型常量,例如’\n’表示换行符。例如:

char myChar = 'B'; // 字符型常量'B'
char newline = '\n'; // 转义字符'\n'表示换行符

3.3 浮点型(float和double)

3.3.1 浮点型变量的声明与初始化

浮点型变量用于存储带小数点的数值。在C语言中,可以通过以下方式声明和初始化浮点型变量:

float myFloat = 3.14f; // 声明一个名为myFloat的浮点型变量,并初始化为3.14
double myDouble = 2.71828; // 声明一个名为myDouble的双精度浮点型变量,并初始化为2.71828

3.3.2 浮点型常量的表示方法

浮点型常量可以用十进制或科学记数法表示。例如:

float decimalConstant = 6.02e23; // 十进制表示法,科学记数法表示法,e后面是指数部分
double scientificConstant = 2E-308; // 双精度浮点数,科学记数法表示法,E后面是指数部分

3.3 浮点型(float和double)

浮点型变量用于存储带有小数点的数值。根据精度的不同,浮点型可以分为单精度浮点型(float)和双精度浮点型(double)。

3.3.1 浮点型变量的声明与初始化

要声明一个浮点型变量,你需要使用float或double关键字,并为其分配一个变量名。例如:

float myFloat; // 声明一个单精度浮点型变量myFloat
double myDouble; // 声明一个双精度浮点型变量myDouble

初始化浮点型变量就是在声明的同时为其赋值。例如:

float myFloat = 3.14f; // 声明并初始化单精度浮点型变量myFloat为3.14
double myDouble = 2.71828; // 声明并初始化双精度浮点型变量myDouble为2.71828

3.3.2 浮点型常量的表示方法

浮点型常量可以用小数形式或科学记数法表示。例如:

float pi = 3.14159f; // 小数形式表示的浮点型常量
double e = 2.71828e+00; // 科学记数法表示的双精度浮点型常量

3.4 变量赋值的注意事项

在C语言中,给变量赋值时需要注意以下几点:

  • 类型匹配:确保赋值运算符两边的数据类型是匹配的。否则,可能会导致数据丢失或程序错误。例如,不能将一个较大的整型值赋给一个较小的整型变量,除非该值在较小的整型变量的取值范围内。同样,将一个较大的实数赋给一个较小的实型变量也可能导致精度损失。
  • 初始化:在声明变量时,最好将其初始化为一个已知的值,而不是让它的值不确定或为垃圾值。这有助于避免程序中的错误和未定义的行为。
  • 赋值运算符:在C语言中,赋值运算符是“=”,它表示将右侧的值赋给左侧的变量。需要注意的是,C语言中的赋值运算符是左结合的,这意味着表达式中左侧的变量会首先被赋值。此外,还需要注意不要在条件语句中误用赋值运算符“=”和等号“==”。前者是赋值,后者是判断是否相等。
  • 常量赋值:常量是不能被赋值的。试图修改常量的值会导致编译错误。例如,试图修改一个整型字面量的值会导致错误。

3.5 C语言中的关键字

C语言中的关键字是预定义的关键字,它们具有特殊的含义,不能被用作变量名、函数名或其他标识符。关键字用于表示C语言中的基本数据类型、控制结构、运算符等。一些常见关键字的含义和作用如下:

  • int:表示整型数据类型,用于声明整型变量。
  • float:表示浮点型数据类型,用于声明浮点型变量。
  • char:表示字符型数据类型,用于声明字符型变量。
  • void:表示无类型,用于声明无返回值的函数或无类型的数据。
  • ifelse:用于控制语句,根据条件执行不同的代码块。
  • forwhiledo:用于循环语句,重复执行一段代码。
  • switch:用于多分支选择语句,根据不同的条件执行不同的代码块。
  • breakcontinue:用于跳出循环或结束当前循环。
  • return:用于从函数返回值或结束函数。
  • sizeof:用于获取数据类型或变量所占的字节数。
  • const:用于声明常量,表示变量的值不能被修改。
  • volatile:用于声明易变的变量,表示变量的值可能会在外部被改变。
  • static:用于声明静态变量或函数,表示变量的生命周期或函数的可见性。

还有其他一些关键字,如typedefextern等。

3.6 void类型的使用方法(无类型)

void是C语言中的一个关键字,用于表示无类型。当一个函数返回值为void时,表示该函数不返回任何值。例如:

void myFunction() {  // myFunction是一个void类型的函数,不返回任何值
    // 函数体
}

3.7 sizeof运算符的使用方法

sizeof是C语言中的一个运算符,用于获取数据类型或变量在内存中所占的字节数。其使用方法如下:

sizeof(数据类型或变量名)

例如,要获取一个int类型变量在内存中所占的字节数,可以这样写:

int num = 10;
int size = sizeof(num);  // size将等于4,假设int类型占4个字节

如果要对数据类型而不是变量使用sizeof,可以去掉括号。例如,sizeof(int)将返回int类型所占的字节数。

此外,还可以使用sizeof来获取数组的总字节数。例如:

int arr[10];
int arraySize = sizeof(arr);  // 返回40,假设int类型占4个字节

3.8 const关键字的使用方法(常量)

const是C语言中的一个关键字,用于声明常量。一旦声明了一个常量,它的值就不能被修改。const可以用于声明整型、浮点型、字符型等类型的常量。例如:

const int a = 10;  // a是一个常量,值为10,不能修改
const float pi = 3.14159;  // pi是一个常量,值为3.14159,不能修改
const char *str = "Hello, World!";  // str是一个指向常量的指针,指向一个字符串常量,不能修改所指向的值

3.9 volatile关键字的使用方法(易变)

volatile是C语言中的一个关键字,用于告诉编译器该变量的值可能会在外部被意外地改变。当一个变量被声明为volatile时,编译器不会对其进行优化,并且每次使用该变量时都会从内存中重新读取它的值,而不是使用寄存器中的值。例如:

volatile int x = 10;  // x是一个易变的变量,可能在外部被改变

第四章:C语言运算符

4.1 算术运算符:+、-、*、/、%等

算术运算符用于执行基本的算术运算,如加法、减法、乘法、除法和取模等。这些运算符可以用于整数和浮点数。

示例:

int a = 5;
int b = 3;
int sum = a + b;  // 加法
int diff = a - b;  // 减法
int prod = a * b;   // 乘法
int quot = a / b;    // 除法
int mod = a % b;      // 取模

4.2 关系运算符:>、<、>=、<=、==等

关系运算符用于比较两个值之间的关系,并根据关系的结果返回真或假。关系运算符可以用于任何数据类型。

示例:

int a = 5;
int b = 3;
if (a > b) {
    printf("a 大于 b\n");
} else if (a < b) {
    printf("a 小于 b\n");
} else {
    printf("a 等于 b\n");
}

4.3 逻辑运算符:&&、||、!等

逻辑运算符用于执行逻辑运算,如逻辑与、逻辑或和逻辑非。逻辑运算符的结果是真或假。

示例:

int x = 5;
int y = 10;
if (x > 0 && y < 20) {
    printf("x 大于 0 且 y 小于 20\n");
} else {
    printf("条件不成立\n");
}

4.4 位运算符:&、|、~、^、<<、>>等

位运算符用于对二进制位进行操作。位运算符可以对整数类型进行位运算。

示例:

int a = 60;  // 二进制表示为 00101100
int b = 13;  // 二进制表示为 00001101
int c = a & b;  // 按位与,结果为 00001000,即十进制中的 8
int d = a | b;  // 按位或,结果为 00101101,即十进制中的 61
int e = ~a;     // 按位非,结果为 11010011,即十进制中的 -61(在有符号整数中)
int f = a ^ b;   // 按位异或,结果为 00100101,即十进制中的 45
int g = a << 2;   // 左移,结果为 01011000,即十进制中的 88(左移两位相当于乘以4)
int h = a >> 2;   // 右移,结果为 00001011,即十进制中的 11(右移两位相当于除以4)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值