简介
-
C语言是一种常用的编程语言,它具有基础语法良好的特性。在C语言中,基础语法主要包括基本数据类型、运算符、流程控制、函数、指针、数组和结构体等。
-
C语言支持多种基本数据类型。其中整型包括int、short、long、long
long等,浮点型包括float、double等,字符型则使用char类型。这些数据类型在不同的情境下有不同的用途,通过它们可以体现出C语言的强大之处。 -
除了基本数据类型,C语言还有各种运算符。这些运算符包括算术运算符、比较运算符、逻辑运算符等,它们可以用于各种计算和判断操作。值得一提的是,C语言中的指针运算符是一种特殊的运算符,它可以让程序员直接处理内存地址,从而实现更高效的编程。
-
在编写程序时,流程控制是必不可少的。C语言提供了if/else、switch、for、while等流程控制语句,可以根据不同的条件执行不同的操作。这些流程控制语句都具有很高的灵活性,可以满足各种编程需求。
-
C语言中的指针也是一大特点。通过指针,程序员可以直接访问内存地址,从而实现更加灵活和高效的编程。指针可以用于数组、函数等方面,它是C语言中不可或缺的一部分。
C语言具有基础语法良好、功能强大的特性。程序员可以根据不同的需求,灵活运用各种语法特点,编写出高效、健壮的程序。
C语言基础语法
1.基本数据类型
数据类型 | 描述 | 取值范围 |
---|---|---|
整型类型 | - | - |
整型 (int) | 表示整数值,通常用于整数计算 | 取值范围因平台和编译器而异,通常为 -2147483648 到 2147483647 |
浮点型 (float) | 表示带有小数部分的数值,用于浮点数计算 | 1.2E-38 到 3.4E+38 |
双精度浮点型 (double) | 表示高精度的浮点数值,用于需要更高精度的计算 | 2.3E-308 到 1.7E+308 |
字符 | - | - |
字符型 (char) | 表示单个字符,通常用于存储ASCII字符 | 取值范围为 ’ ’ (空格) 到 ‘~’ (波浪号) |
字符串类型 (string) | 表示一串字符的集合,用于存储和操作文本数据 | 字符串的取值范围取决于字符串的长度,通常由程序员确定 |
布尔型 (bool) | 表示真或假的值,通常用于逻辑运算 | 取值范围为 true 或 false |
枚举类型 (enum) | 表示一组命名的整数常量,用于枚举值的定义 | 取值范围为所定义的整数常量范围 |
结构体类型 (struct) | 表示一组不同类型的变量集合,用于存储相关数据 | 结构体中各成员变量的取值范围取决于其数据类型 |
联合类型 (union) | 表示一组不同类型的变量共享同一内存地址,用于节省内存空间 | 取值范围取决于最近一次写入的值的数据类型 |
指针类型 (*) | 表示内存地址,用于访问和操作内存中的数据 | 取值范围取决于指针所指向的数据类型和内存地址空间限制 |
2.运算符
运算符 | 描述 |
---|---|
+ | 加法运算符,用于将两个数相加。 |
- | 减法运算符,用于从一个数中减去另一个数。 |
* | 乘法运算符,用于将两个数相乘。 |
/ | 除法运算符,用于将一个数除以另一个数。 |
% | 取模运算符,用于获取两个数相除后的余数。 |
== | 等于运算符,用于比较两个值是否相等。 |
!= | 不等于运算符,用于比较两个值是否不相等。 |
> | 大于运算符,用于比较左边的值是否大于右边的值。 |
< | 小于运算符,用于比较左边的值是否小于右边的值。 |
>= | 大于等于运算符,用于比较左边的值是否大于或等于右边的值。 |
<= | 小于等于运算符,用于比较左边的值是否小于或等于右边的值。 |
&& | 逻辑与运算符,当且仅当两个条件都为真时返回真。 |
! | 逻辑非运算符,用于反转一个条件的真假值。 |
& | 位与运算符,用于对二进制位进行与操作。 |
| | 位或运算符,用于对二进制位进行或操作。 |
^ | 位异或运算符,用于对二进制位进行异或操作。 |
~ | 位取反运算符,用于对二进制位进行取反操作。 |
<< | 左移运算符,将二进制位向左移动指定的位数。 |
>> | 右移运算符,将二进制位向右移动指定的位数。 |
++ | 自加运算符,将变量的值增加1。 |
– | 自减运算符,将变量的值减少1。 |
3.流程控制与搭配
流程控制 | 描述 |
---|---|
if | 条件语句,根据给定的条件执行不同的代码块。 |
else | 用于指定当条件不满足时要执行的代码块。 |
switch | 根据一个表达式的值来选择要执行的代码块。 |
case | 用于定义switch语句中各个可能的值和对应的代码块。 |
default | 用于指定当没有任何case值匹配时要执行的代码块。 |
for | 循环语句,用于重复执行一段代码直到满足指定的条件。 |
while | 循环语句,只要给定的条件为真就重复执行一段代码。 |
do | 循环语句,先执行一次代码块,然后根据条件决定是否继续执行。 |
break | 用于跳出当前循环或switch语句。 |
continue | 用于跳过当前循环的剩余部分,直接进入下一次循环。 |
流程控制的搭配:
- if-else语句:根据条件判断执行不同的代码块。
- switch-case语句:根据表达式的值选择要执行的代码块。
- for循环:重复执行一段代码直到满足指定的条件。
- while循环:只要给定的条件为真就重复执行一段代码。
- do-while循环:先执行一次代码块,然后根据条件决定是否继续执行。
- break语句:跳出当前循环或switch语句。
- continue语句:跳过当前循环的剩余部分,直接进入下一次循环。
4.函数
- 函数是C语言的基础模块,是以完成某种目的为目标的语句的集合。它们有较强的独立性,可以相互调用。当我们需要使用函数内相关的功能时,只需要调用函数就可以完成功能,能大大减少冗余重复语句的使用,增强代码的可读性。
在C语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
- 返回类型:函数可以返回一个值,return_type是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type是关键字void。
- 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
5.指针
-
指针是C语言中非常重要的概念,它可以用来存储变量的地址。指针变量声明时需要指定指针所指向的数据类型,例如int *p表示p是一个指向整型数据的指针。
-
指针在内存中的表示是通过地址来实现的。每个变量在内存中都有一个特定的地址,指针就是用来存储这个地址的变量。通过指针可以间接地访问和操作变量的值。
下面是一些关于指针的基本操作:
- 定义指针变量:int *p;
- 给指针赋值:p = &a; //将变量a的地址赋给指针p
- 访问指针所指向的值:*p; //获取指针p所指向的变量的值
- 指针运算:++p, --p, p++, p–等
下面是一个简单的示例代码,演示了如何使用指针来访问和修改变量的值:
#include <stdio.h>
int main() {
int a = 10; //定义一个整型变量a并初始化为10
int *p; //定义一个整型指针p
p = &a; //将变量a的地址赋给指针p
printf("a的值是: %d
", a); //输出a的值
printf("a的地址是: %p
", &a); //输出a的地址
printf("指针p的值(即a的地址)是: %p
", p); //输出指针p的值(即a的地址)
printf("指针p所指向的变量的值(即a的值)是: %d
", *p); //输出指针p所指向的变量的值(即a的值)
*p = 20; //通过指针修改变量a的值
printf("修改后的a的值是: %d
", a); //输出修改后的a的值
return 0;
}
运行结果如下:
a的值是: 10
a的地址是: 0x7ffee3b4c9c0
指针p的值(即a的地址)是: 0x7ffee3b4c9c0
指针p所指向的变量的值(即a的值)是: 10
修改后的a的值是: 20
6.数组
-
数组是一种数据结构,用于存储多个相同类型的元素。在计算机编程中,数组通常被用来处理大量数据。
-
数组的元素可以通过索引来访问和修改。索引是从0开始的整数,表示元素在数组中的位置。例如,如果一个数组包含5个元素,那么第一个元素的索引是0,第二个元素的索引是1,以此类推。
-
数组可以是一维、二维或多维的。一维数组只有一个维度,每个元素都有相同的长度。二维数组有两个维度,每个元素都是一个一维数组。多维数组有多个维度,每个元素都是一个更低维度的数组。
下面是一个示例代码,演示了如何声明和初始化一个一维数组:
int myArray[5] = {1, 2, 3, 4, 5}; // 声明并初始化一个包含5个整数的一维数组
这个数组包含了5个整数类型的元素,分别是1、2、3、4和5。这些元素可以通过索引来访问和修改,例如:
myArray[0] = 6; // 将第一个元素修改为6
myArray[2] = 7; // 将第三个元素修改为7
下面是一张图像,展示了一个包含5个整数的一维数组的表示方式:
+---+---+---+---+---+---+---+
索引///| 1 | 2 | 3 | 4 | 5 |
-----------------------------
数据/值| 6 | 2 | 7 | 4 | 5 |
+---+---+---+---+---+---+---+
在这个图像中,每个方格代表一个数组元素,方格中的值表示该元素的值。
结构体
- 结构体是一种复合数据类型,它由多个不同类型的成员变量组成。每个成员变量都有一个名称和一个类型。结构体可以用于将不同类型的数据组合在一起,以便在程序中更方便地处理这些数据。
例如,我们可以定义一个名为Student的结构体,其中包含姓名(name)和分数(scores)两个成员:
struct Student {
char name[20];
int scores[5];
};
然后,我们可以定义一个包含10个元素的结构体数组students:
struct Student students[10];
在这个例子中,students
是一个包含10个元素的结构体数组,每个元素都是一个Student
类型的结构体。每个Student
结构体包含一个名为scores
的整型数组和一个名为name
的字符数组。
在图像表示上,结构体数组可以看作是一个矩阵,其中的每个元素都是一个结构体。结构体中的成员对应矩阵中的元素。例如,以下是一个包含3个学生的结构体数组的图像表示:
+--------+------------+
| name | scores |
+--------+------------+
| Student1 | 85, 90, 88 |
| Student2 | 78, 80, 85 |
| Student3 | 92, 88, 91 |
+--------+------------+
枚举
枚举类型是C语言中的一种数据类型,它允许我们定义一组命名的常量。这些常量可以是整数、字符或其他类型的值。枚举类型的语法如下:
enum 枚举名 {
枚举常量1,
枚举常量2,
...
};
例如,我们可以定义一个表示星期的枚举类型:
// 定义一个表示星期的枚举类型
enum Weekday {
Monday, // 星期一
Tuesday, // 星期二
Wednesday, // 星期三
Thursday, // 星期四
Friday, // 星期五
Saturday, // 星期六
Sunday // 星期日
};
接下来,我们可以使用枚举类型来声明变量和进行比较:
#include <stdio.h>
int main() {
enum Weekday today = Monday; // 声明一个枚举类型的变量today,并将其初始化为星期一
if (today == Monday) {
printf("今天是星期一
");
} else if (today == Tuesday) {
printf("今天是星期二
");
} else if (today == Wednesday) {
printf("今天是星期三
");
} else if (today == Thursday) {
printf("今天是星期四
");
} else if (today == Friday) {
printf("今天是星期五
");
} else if (today == Saturday) {
printf("今天是星期六
");
} else if (today == Sunday) {
printf("今天是星期日
");
}
return 0;
}
在这个例子中,我们使用了枚举类型Weekday
来声明一个变量today
,并将其初始化为星期一。然后,我们使用一系列的if
语句来判断today
的值,并输出相应的结果。