目录
十一.数组
数组是按顺序存储的一系列类型相同的值,如10个char类型的字符或15个int 类型的值。整个数组有一个数组名,通过整数下标访问数组中单独的项或元素。
11.1数组的定义和声名:
在C语言中,数组的定义和声明包括两个主要部分:数据类型和数组名。例如,我们可以使用以下方式定义一个整型数组:
int arr[5];
声明arr是一个内含5个元素的数组,每个元素都可以存储int类型的值。
11.2数组的初始化:
数组可以在定义时进行初始化,也可以在后续的代码中进行初始化。以下是一些常见的数组初始化方式:
a)在定义时初始化数组:
int arr[5] = { 1,2,3,4,5 };
b)逐个元素初始化数组:
int arr[5];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
c)使用循环初始化数组:
int arr[5];
for (int i = 0; i < 5; i++)
{
arr[i] = i + 1;
}
11.3数组的访问:
数组中的元素可以通过索引来访问,索引从0开始,依次递增。例如:
int arr[5] = { 1,2,3,4,5 };
printf("%d\n", arr[0]);//输出第一个元素:1
printf("%d\n", arr[2]);//输出第三个元素:3
printf("%d\n", arr[4]);//输出最后一个元素:5
数组的第一个元素是arr[0],第二个元素是arr[1],以此类推,直到arr[4]。注意,数组元素的编号从0开始,不是从1开始。
十二.操作符
C语言操作符是用于执行各种操作的符号或关键字。在C语言中,有许多不同类型的操作符,包括算数操作符,关系操作符,逻辑操作符,位操作符,赋值操作符等。下面将介绍C语言中常见的操作符及其使用方法:
12.1算术操作符:
算数操作符用于执行基本的数学运算,包括加法,减法,乘法,除法和取模等。
- 加法操作符(+):用于执行两个数的相加操作。
int a = 5;
int b = 3;
int c = a + b;//c的值为8
- 减法操作符(-):用于执行两个数的相减操作。
int a = 5;
int b = 3;
int c = a - b;//c的值为2
- 乘法操作符(*):用于执行两个数的相乘操作。
int a = 5;
int b = 3;
int c = a * b;//c的值为15
- 除法操作符(/):用于执行两个数的相除操作。
int a = 5;
int b = 3;
int c = a / b;//c的值为1(整数除法,舍去小数部分)
- 取模操作符(%):用于计算两个数的余数。
int a = 5;
int b = 3;
int c = a % b;//c的值为2(5除以3的余数)
12.2关系操作符:
关系操作符用于比较两个数的关系,返回一个布尔值(真或假)。
- 相等操作符(==):用于判断两个数是否相等。
int a = 5;
int b = 3;
if (a == b)
{
//执行代码块
}
- 不等操作符(!=):用于判断两个数是否不相等。
int a = 5;
int b = 3;
if (a != b)
{
//执行代码块
}
- 大于操作符(>):用于判断一个数是否大于另一个数。
int a = 5;
int b = 3;
if (a > b)
{
//执行代码块
}
- 小于操作符(<):用于判断一个数是否小于另一个数。
int a = 5;
int b = 3;
if (a < b)
{
//执行代码块
}
- 大于等于操作符(>=):用于判断一个数是否大于等于另一个数。
int a = 5;
int b = 3;
if (a >= b)
{
//执行代码块
}
- 小于等于操作符(<=):用于判断一个数是否小于等于另一个数。
int a = 5;
int b = 3;
if (a <= b)
{
//执行代码块
}
12.3逻辑操作符:
逻辑操作符用于执行逻辑运算,包括逻辑与,逻辑或和逻辑非等。
- 逻辑与操作符(&&):用于判断两个条件是否同时满足。
int a = 5;
int b = 3;
int c = 7;
if (a > b && a < c)
{
//执行代码块
}
- 逻辑或操作符(||):用于判断两个条件是否有一个满足。
int a = 5;
int b = 3;
int c = 7;
if (a > b || a < c)
{
//执行代码块
}
- 逻辑非操作符(!):用于取反一个条件的值。
int a = 5;
int b = 3;
if (!(a > b))
{
//执行代码块
}
12.4位操作符:
位操作符用于对二进制位进行操作。
- 按位与操作符(&):对两个数的二进制位进行按位与操作。
int a = 5;
int b = 3;
int c = a & b;//c的值为1(二进制位运算)
- 按位或操作符(|):对两个数的二进制位进行按位或操作。
int a = 5;
int b = 3;
int c = a | b;//c的值为7(二进制位运算)
- 按位异或操作符(^):对两个数的二进制位进行按位异或操作。
int a = 5;
int b = 3;
int c = a ^ b;//c的值为6(二进制位运算)
- 按位取反操作符(~):对一个数的二进制位进行按位取反操作。
int a = 5;
int b = ~a;//b的值为-6(二进制位运算)
- 左移操作符(<<):将一个数的二进制位向左移动指定的位数。
int a = 5;
int b = a << 2;//b的值为20(将a的二进制位向左移动2位)
- 右移操作符(>>):将一个数的二进制位向右移动指定的位数。
int a = 5;
int b = a >> 2;//b的值为1(将a的二进制位向右移动2位)
12.5赋值操作符:
赋值操作符用于将一个值赋给变量。
- 简单赋值操作符(=):将一个值赋给变量。
int a = 5;
int b;
b = a;//将a的值赋给b
- 复合赋值操作符(+=,-=,*=,/=,%=):将一个值与变量进行运算,并将结果赋给变量。
int a = 5;
int b = 3;
a += b;//相当于a = a + b,a的值为8
十三.关键字
1. auto:
用于声明自动变量,即在函数内部定义的变量。这些变量的生命周期与函数的执行周期相同。
void func()
{
auto int num = 10;
printf("%d", num);
}
2. break:
用于跳出循环或switch语句。当程序执行到break语句时,会立即终止当前循环或switch语句的执行。
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
break;
}
printf("%d\n", i);
}
3. case:
用于定义switch语句中的分支条件。每个case语句后面都必须跟一个唯一的常量值或常量表达式。
int num = 2;
switch (num)
{
case 1:
printf("One");
break;
case 2:
printf("Two");
break;
default:
printf("Other");
break;
}
4. char:
用于声明字符类型的变量。char类型的变量通常用于存储单个字符。
char ch = 'A';
printf("%c", ch);
5. const:
用于声明常量。const修饰的变量的值在程序运行期间不可修改。
const int MAX = 100;
printf("%d", MAX);
6. continue:
用于跳过当前循环的剩余部分,进入下一次循环。
for (int i = 0; i < 10; i++)
{
if (i == 2)
{
continue;
}
prinrf("%d\n", i);
}
7. default:
用于定义switch语句中的默认分支。当switch的表达式的值与任何case都不匹配时,会执行default分支。
int num = 2;
switch (num)
{
case 1:
printf("One");
break;
case 2:
printf("Two");
break;
default:
printf("Other");
break;
}
8. do:
用于定义do-while循环。do-while循环会先执行循环体,然后再判断循环条件。
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 5);
9. double:
用于声明双精度浮点数类型的变量。double类型的变量可以存储更大范围的浮点数。
double num = 3.14;
printf("%lf", num);
10. else:
用于定义if语句中的条件不成立时的执行代码块。
int num = 5;
if (num > 10)
{
printf("Greater than 10");
}
else {
printf("Less than or equal to 10");
}
11. enum:
用于定义枚举类型。枚举类型是一种用户自定义的数据类型,它由一组常量值组成。
enum Color
{
RED,
GREEN,
BLUE
};
enum Color color = GREEN;
printf("%d", color);
12. extern:
用于声明外部变量或函数。extern修饰的变量或函数可以在其他文件中使用。
// 文件1.c extern int num;
// 文件2.c int num = 10;
13. float:
用于声明单精度浮点数类型的变量。float类型的变量可以存储较小范围的浮点数。
float num = 3.14;
printf("%f", num);
14. for:
用于定义for循环。for循环由三个部分组成:初始化表达式、循环条件和循环后表达式。
for (int i = 0; i < 5; i++)
{
printf("%d\n", i);
}
15. goto:
用于无条件地跳转到程序中的标签位置。goto语句通常被认为是一种不良的编程风格,应尽量避免使用。
for (int i = 0; i < 10; i++)
{
if (i == 5)
{
goto end;
}
printf("%d\n", i);
}
end:
printf("Loop ended");
16. if:
用于定义条件语句。if语句根据条件的真假来执行不同的代码块。
int num = 5;
if (num > 10)
{
printf("Greater than 10");
}
else
{
printf("Less than or equal to 10");
}
17. int:
用于声明整数类型的变量。int类型的变量可以存储整数值。
int num = 10;
printf("%d", num);
18. long:
用于声明长整数类型的变量。long类型的变量可以存储更大范围的整数。
long num = 1000000000;
printf("%ld", num);
19. register:
明寄存器变量。register修饰的变量会尽量存储在CPU的寄存器中,以提高访问速度。
register int num = 10;
printf("%d", num);
20. return:
用于从函数中返回值。return语句会终止当前函数的执行,并将一个值返回给调用者。
int add(int a, int b)
{
return a + b;
}
int sum = add(2, 3);
printf("%d", sum);
21. short:
用于声明短整数类型的变量。short类型的变量可以存储较小范围的整数。
short num = 100;
printf("%d", num);
22. signed:
用于声明有符号数类型的变量。有符号数可以表示正数、负数和零。
signed int num = -10;
printf("%d", num);
23. sizeof:
用于获取变量或数据类型的大小(以字节为单位)。
int arr[5] = { 1, 2, 3, 4, 5 };
int size = sizeof(arr) / sizeof(arr[0]);
printf("%d", size);
24. static:
用于声明静态变量或函数。静态变量的生命周期与程序的执行周期相同,但作用域仅限于声明它的函数内部。
void increment()
{
static int num = 0;
num++;
printf("%d\n", num);
}
increment(); // 输出:1
increment(); // 输出:2
25. struct:
用于定义结构体类型。结构体是一种用户自定义的数据类型,它可以包含多个不同类型的成员变量。
struct Person
{
char name[20];
int age;
};
struct Person p;
strcpy(p.name, "John");
p.age = 30;
printf("%s, %d", p.name, p.age);
26. switch:
用于定义多分支选择语句。switch语句根据表达式的值选择执行不同的分支。
int num = 2;
switch (num)
{
case 1:
printf("One");
break;
case 2:
printf("Two");
break;
default:
printf("Other");
}
27. typedef:
用于为已有数据类型定义一个新的别名。typedef可以提高代码的可读性和可维护性。
typedef int Number;
Number num = 10;
printf("%d", num);
28. union:
用于定义联合类型。联合是一种特殊的数据类型,它可以在同一内存空间存储不同类型的数据。
union Data
{
int num;
float value;
};
union Data d;
d.num = 10;
printf("%d", d.num);
29. unsigned:
用于声明无符号数类型的变量。无符号数只能表示非负整数。
unsigned int num = 10;
printf("%u", num);
30. void:
用于声明无类型或函数无返回值。void类型的指针可以指向任何类型的数据。
void greet()
{
printf("Hello");
}
greet();
31. volatile:
用于声明易变变量。volatile修饰的变量表示它的值可能在不同的时间点被修改。
int main()
{
volatile int count = 0;
while (count < 5)
{
printf("Count: %d\n", count);
count++;
}
return 0;
}
在上面的示例中,我们声明了一个`volatile`修饰符的整数变量`count`。这意味着编译器不会对`count`进行任何优化,以确保每次循环都会检查`count`的实际值。如果我们没有使用`volatile`关键字,编译器可能会认为`count`的值在循环中没有变化,因此可能会对循环进行优化,导致循环只执行一次。