147
									
								
								docs/c.md
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								docs/c.md
									
									
									
									
									
								
							@@ -180,7 +180,7 @@ printf(“%md”,a);
 | 
				
			|||||||
2. 若 m > 实际数据的宽度,则在实际数据的左边用空格补齐  
 | 
					2. 若 m > 实际数据的宽度,则在实际数据的左边用空格补齐  
 | 
				
			||||||
3. `printf(“%0md”,a);`	则实际的结果不够 m 位的在数据的左边用0补齐  
 | 
					3. `printf(“%0md”,a);`	则实际的结果不够 m 位的在数据的左边用0补齐  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
对于浮点型数据,宽度=整数部分的位数+小数点+小数部分的宽度  
 | 
					对于浮点型数据,**数据的宽度=整数部分的位数+小数点+小数部分的宽度**  
 | 
				
			||||||
假设:   
 | 
					假设:   
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
float a = 1.2345; 
 | 
					float a = 1.2345; 
 | 
				
			||||||
@@ -194,24 +194,29 @@ printf(“%m.nf”,a); //m --整个数据的宽度,n--小数位数
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 字符串 Strings
 | 
					### 字符串 Strings
 | 
				
			||||||
 | 
					在C语言中,字符串是以 `\0` 结尾的字符数组,而不是一种单独的数据类型  
 | 
				
			||||||
 | 
					可以通过字符数组来表示字符串  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					定义并打印字符串  
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
char greetings[] = "Hello World!";
 | 
					char greetings[] = "Hello World!";
 | 
				
			||||||
printf("%s", greetings);
 | 
					printf("%s", greetings);
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
访问字符串
 | 
					访问字符串中的字符
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
char greetings[] = "Hello World!";
 | 
					char greetings[] = "Hello World!";
 | 
				
			||||||
printf("%c", greetings[0]);
 | 
					printf("%c", greetings[0]);
 | 
				
			||||||
 | 
					//这里我们访问字符串 greetings 的第一个字符'H'
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
修改字符串
 | 
					修改字符串中的字符
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
char greetings[] = "Hello World!";
 | 
					char greetings[] = "Hello World!";
 | 
				
			||||||
greetings[0] = 'J';
 | 
					greetings[0] = 'J';  //// 修改第一个字符为 'J'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
printf("%s", greetings);
 | 
					printf("%s", greetings);
 | 
				
			||||||
// 输出 "Jello World!"
 | 
					// 输出 "Jello World!"
 | 
				
			||||||
@@ -226,7 +231,8 @@ printf("%s", greetings);
 | 
				
			|||||||
// 输出 "Hell!"
 | 
					// 输出 "Hell!"
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`C` **没有** String 类型,使用 `char` 类型并创建一个字符 `array`
 | 
					C语言中**没有**`String`类型,字符串是由字符数组(Array)`char[]`来表示的,且必须以 \0 结尾以标识字符串的结束  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 条件判断
 | 
					### 条件判断
 | 
				
			||||||
<!--rehype:wrap-class=row-span-2-->
 | 
					<!--rehype:wrap-class=row-span-2-->
 | 
				
			||||||
@@ -293,6 +299,28 @@ switch (day) {
 | 
				
			|||||||
    printf("期待周末");
 | 
					    printf("期待周末");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
// 输出 -> "周四" (day 4)
 | 
					// 输出 -> "周四" (day 4)
 | 
				
			||||||
 | 
					/* 解释:
 | 
				
			||||||
 | 
					switch 语句会根据表达式 day 的值来跳转到匹配的 case 标签
 | 
				
			||||||
 | 
					匹配到 case 4 时,会执行相应的代码并通过 break 跳出 switch 语句
 | 
				
			||||||
 | 
					如果没有匹配到任何 case,则会执行 default 语句(如果存在)
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					注意:
 | 
				
			||||||
 | 
					1. switch 后面括号中的表达式可以是整型、字符型和枚举型
 | 
				
			||||||
 | 
					2. 在`case`后的各常量表达式的值不能相同
 | 
				
			||||||
 | 
					3. 在`case`后,允许有多个语句,可以不用{ }括起来,而整个 switc h结构一定要有一对{}
 | 
				
			||||||
 | 
					4. 各`case`和`default`语句的先后顺序可以改变,不影响程序执行结果
 | 
				
			||||||
 | 
					5. `break`语句用于结束 switch,如果没有`break`,程序会穿透到下一个`case`继续执行,例如  
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					int day = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					switch (day) {
 | 
				
			||||||
 | 
					  case 3: printf("周三"); 
 | 
				
			||||||
 | 
					  case 4: printf("周四"); break;
 | 
				
			||||||
 | 
					  default:
 | 
				
			||||||
 | 
					    printf("期待周末");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					// 输出 -> "周三周四" 
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### While 循环
 | 
					### While 循环
 | 
				
			||||||
@@ -304,9 +332,14 @@ while (i < 5) {
 | 
				
			|||||||
  printf("%d\n", i);
 | 
					  printf("%d\n", i);
 | 
				
			||||||
  i++;
 | 
					  i++;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					/*解释:
 | 
				
			||||||
 | 
					在 while 循环中,首先检查条件 i < 5 是否为真
 | 
				
			||||||
 | 
					如果为真,程序进入循环体,执行打印操作并增加 i 的值
 | 
				
			||||||
 | 
					循环会继续进行,直到 i 达到 5,此时条件 i < 5 不再为真,循环结束
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**注意**:不要忘记增加条件中使用的变量,否则循环永远不会结束,成为“死循环”!
 | 
					**注意**:不要忘记在循环体内修改循环条件中的变量(如 i++),否则循环将永远执行下去,成为“死循环”
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Do/While 循环
 | 
					### Do/While 循环
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -317,9 +350,33 @@ do {
 | 
				
			|||||||
  printf("%d\n", i);
 | 
					  printf("%d\n", i);
 | 
				
			||||||
  i++;
 | 
					  i++;
 | 
				
			||||||
} while (i < 5);
 | 
					} while (i < 5);
 | 
				
			||||||
 | 
					/*解释:
 | 
				
			||||||
 | 
					在 do/while 循环中,循环体至少执行一次,因为条件检查是在循环体执行之后进行的
 | 
				
			||||||
 | 
					首先执行 do 中的代码,然后检查条件 i < 5 是否为真
 | 
				
			||||||
 | 
					如果为真,继续执行循环;如果为假,则退出循环
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					**注意**:与`while`循环不同,`do/while`循环会确保至少执行一次循环体,即使条件一开始就为假  
 | 
				
			||||||
 | 
					例如,以下代码虽然条件`i < 5`初始时为假,但仍然会执行一次:
 | 
				
			||||||
 | 
					```C
 | 
				
			||||||
 | 
					int i = 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					do {
 | 
				
			||||||
 | 
					  printf("%d\n", i);  // 输出 5
 | 
				
			||||||
 | 
					  i++;
 | 
				
			||||||
 | 
					} while (i < 5);
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### For 循环
 | 
					### For 循环
 | 
				
			||||||
 | 
					语法:
 | 
				
			||||||
 | 
					```C
 | 
				
			||||||
 | 
					for(表达式 1;表达式 2;表达式 3){
 | 
				
			||||||
 | 
					  循环体语句;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					表达式 1:设置初始条件,只执行一次,为 0 个或多个变量设置初值  
 | 
				
			||||||
 | 
					表达式 2:是循环条件表达式,用来判定是否继续循环。在每次执行循环体之前要先执行表达式 2,然后再决定是否继续执行循环  
 | 
				
			||||||
 | 
					表达式 3:作为循环的调整,比如是循环体变量增值,它是执行循环体语句之后再执行
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
int i;
 | 
					int i;
 | 
				
			||||||
@@ -327,11 +384,40 @@ int i;
 | 
				
			|||||||
for (i = 0; i < 5; i++) {
 | 
					for (i = 0; i < 5; i++) {
 | 
				
			||||||
  printf("%d\n", i);
 | 
					  printf("%d\n", i);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					/* 输出:
 | 
				
			||||||
 | 
					0
 | 
				
			||||||
 | 
					1
 | 
				
			||||||
 | 
					2
 | 
				
			||||||
 | 
					3
 | 
				
			||||||
 | 
					4
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 跳出循环 Break/Continue
 | 
					**注意**: 
 | 
				
			||||||
 | 
					1. for 语句的三个表达式不是必须的
 | 
				
			||||||
 | 
					2. 当条件表达式(表达式 2)的值为假(为 0)时 for 循环语句就结束
 | 
				
			||||||
 | 
					3. 可以在循环体内执行`break`,`continue`,`goto`语句
 | 
				
			||||||
 | 
					4. 若表达式 2 是空的,表明表达式 2 的值一直是真,即死循环  
 | 
				
			||||||
 | 
					如:`for(;;) //死循环语句  相当于while(1)`  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**变体**:
 | 
				
			||||||
 | 
					- `for(i = m; i < n; i++)`会从 i = m 开始到 i = n-1,循环 n - m 次
 | 
				
			||||||
 | 
					- `for(i = m; i <= n; i++)`会从 i = m 到 i = n,循环 n - m + 1 次
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 跳出循环(中断语句) Break/Continue/Goto
 | 
				
			||||||
<!--rehype:wrap-class=row-span-2-->
 | 
					<!--rehype:wrap-class=row-span-2-->
 | 
				
			||||||
 | 
					`break`语句:跳出本层循环,执行循环后的语句  
 | 
				
			||||||
 | 
					`continue`语句:跳出本次循环,执行下一次循环  
 | 
				
			||||||
 | 
					`goto`语句:跳出到指定的标号位  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**1.`break`语句**:  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`break`用于跳出当前的循环或`switch`语句,直接跳到循环或`switch`语句之后的下一条语句  
 | 
				
			||||||
 | 
					通常用于在特定条件下提前结束循环
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
int i;
 | 
					int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -341,10 +427,16 @@ for (i = 0; i < 10; i++) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  printf("%d\n", i);
 | 
					  printf("%d\n", i);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					//输出:
 | 
				
			||||||
 | 
					//0 1 2 3 4(换行符使用空格代替)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
在 `i` 等于 `4` 时跳出循环
 | 
					当`i`等于 4 时,`break`语句使得循环提前结束,因此没有打印出 4 及之后的值
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**2.`continue`语句**:  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`continue`用于跳过当前循环中的剩余语句(在for循环中相当于直接执行表达式3),直接进入下一次循环的条件判断阶段   
 | 
				
			||||||
 | 
					通常用于跳过某些特定的循环迭代
 | 
				
			||||||
```c
 | 
					```c
 | 
				
			||||||
int i;
 | 
					int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -354,37 +446,44 @@ for (i = 0; i < 10; i++) {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  printf("%d\n", i);
 | 
					  printf("%d\n", i);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					//输出:
 | 
				
			||||||
 | 
					//0 1 2 3 5 6 7 8 9(换行符使用空格代替)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
示例跳过 `4` 的值
 | 
					当`i`等于 4 时,`continue`会跳过打印语句,因此 4 被跳过,不会输出
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### While Break 示例
 | 
					**3.`goto`语句**: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```c
 | 
					`goto`用于无条件跳转到程序中的指定标签位置  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```C
 | 
				
			||||||
int i = 0;
 | 
					int i = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
while (i < 10) {
 | 
					while (i < 10) {
 | 
				
			||||||
  if (i == 4) {
 | 
					  if (i == 4) {
 | 
				
			||||||
    break;
 | 
					    goto skip;  // 跳转到 skip 标签
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  printf("%d\n", i);
 | 
					  printf("%d\n", i);
 | 
				
			||||||
  i++;
 | 
					  i++;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					skip:
 | 
				
			||||||
 | 
					printf("Exited the loop at i = %d\n", i);
 | 
				
			||||||
 | 
					/* 输出:
 | 
				
			||||||
 | 
					0
 | 
				
			||||||
 | 
					1
 | 
				
			||||||
 | 
					2
 | 
				
			||||||
 | 
					3
 | 
				
			||||||
 | 
					Exited the loop at i = 4
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### While continue 示例
 | 
					`goto skip`语句将程序的控制流跳转到标签`skip`处,导致循环在`i = 4`时直接结束,并输出`Exited the loop at i = 4`  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```c
 | 
					**注意**:
 | 
				
			||||||
int i = 0;
 | 
					1. `label标签`必须是在当前函数内定义的标签。标签的命名规则与变量的命名规则相同,但标签不能与C语言的关键字冲突
 | 
				
			||||||
 | 
					2. `goto`语句通常用于跳转到同一函数内的某个位置,但也可以跳转到同一文件中的其他函数内的标签(不推荐)
 | 
				
			||||||
while (i < 10) {
 | 
					3. goto语句应慎用,因为过多或滥用goto语句可能会导致代码逻辑混乱、难以维护和阅读。通常情况下,可以使用循环或条件语句等结构化的控制流语句来代替goto语句
 | 
				
			||||||
  i++;
 | 
					 | 
				
			||||||
  if (i == 4) {
 | 
					 | 
				
			||||||
    continue;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  printf("%d\n", i);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
```
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 数组 Arrays
 | 
					### 数组 Arrays
 | 
				
			||||||
<!--rehype:wrap-class=row-span-2-->
 | 
					<!--rehype:wrap-class=row-span-2-->
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user