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