- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
WHILE
-
语法 -> while(循环条件){循环语句}
-
语义 -> 满足循环条件-执行循环语句
-
示例
-
#include <stdio.h> #include <stdlib.h> int main() { /* while(循环条件) { //条件成立执行到此 //循环语句 //跳回循环条件判断为真 } //条件不满足则跳出循环结构执行剩余代码 //TODO */ int a = 0; //条件格式 while (a <= 1000) { printf("%d \r\n", a); a++; } //死循环 while (1) { printf("%d\r\n", a++); } return 0; }
-
DO...WHILE
-
语法 -> do{循环语句} while(循环条件);
-
语义 -> 先执行一次循环再进行循环条件判断
-
示例
-
#include <stdio.h> #include <stdlib.h> int main() { /* do { //循环语句 }while(循环条件); while(循环条件) { //循环语句 } */ int nPassWord = 0; printf("please input password -> "); scanf("%d", &nPassWord); system("pause"); system("cls"); int nTemp = 0; do { if (nTemp == nPassWord) { printf("PassWord -> %d \r\n", nTemp); system("pause"); exit(0); } nTemp++; } while (1); return 0; }
-
FOR
-
语法 -> for(起始表达式; 条件表达式; 末尾循环体) {循环语句}
-
执行
-
起始表达式第一顺位执行 - 且只执行一次
-
条件表达式判断
-
条件成立 - 执行循环内语句 - 执行末尾循环体 - 跳转条件表达式继续判断
-
条件不成立 - 跳出循环
-
-
-
示例
-
#include <stdio.h> #include <stdlib.h> int main() { /* for(起始表达式; 条件表达式; 末尾循环体) { //循环语句 } */ for (int i = 0; i <= 1000; i++) { printf("%d \r\n", i); } return 0; }
-
-
结构
-
常见样式
-
#include <stdio.h> #include <stdlib.h> int main() { //递减 for (int i = 10; i > 0; i--) { printf("%d \r\n", i); } //递增 for (int i = 0; i < 10; i+=2/*i = i + 2*/) { printf("%d \r\n", i); } //字符 for (int i = 'a'; i <= 'z'; i++) { printf("%c ", i); } //拓展 int i = 'a'; for (/*起始表达式*/; i <= 'z';/*末尾循环体*/) { printf("%c ", i); i++; } return 0; }
-
-
代码示例
-
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { //置随机数种植 srand(time(NULL)); //生成随机数 int Num = rand() % 100; //猜大小 for (size_t i = 0; i < 10; i++) { //用户输入 int nTemp = 0; printf("please input integer(0 ~ 100) -> "); scanf_s("%d", &nTemp); if (nTemp == Num) { printf("恭喜你答对了!\r\n"); system("pause"); exit(0); } if (nTemp > Num) { printf("您输入的数字过大\r\n"); } if (nTemp < Num) { printf("您输入的数字过小\r\n"); } } printf("游戏失败\r\n"); return 0; }
-
BREAK
-
作用 -> 跳出选择结构与循环结构
-
break
-
switch语句中跳出对应case分支
-
#include <stdio.h> #include <stdlib.h> int main() { switch (1) { case 1: printf("x"); case 2: printf("x"); case 3: printf("x"); break; } return 0; }
-
-
单循环语句中跳出循环
-
#include <stdio.h> #include <stdlib.h> int main() { for (int i = 0; i < 10; i++) { printf("%d \r\n", i); if (i == 5) { break; } } printf("0xCC\r\n"); return 0; }
-
-
多循环语句中跳出本层循环
-
#include <stdio.h> #include <stdlib.h> int main() { for (int i = 0; i < 10; i++) { for (int j = 1; j < 10; j++) { printf("%d \r\n", i * j); break; } //TODO } printf("0xCC\r\n"); return 0; }
-
-
CONTINUE
-
作用 -> 循环结构中跳过本次循环-直接执行下一次循环
-
#include <stdio.h> #include <stdlib.h> int main() { for (int i = 0; i < 10; i++) { if (i % 2 != 0) { //结束本次循环 continue; } printf("%d \r\n", i); } printf("0xCC\r\n"); return 0; }
-
GOTO
-
作用 -> 无条件跳转
-
语法 -> goto 标号; 标号:
-
#include <stdio.h> #include <stdlib.h> int main() { goto FLAG; while (1) { while (1) { FLAG: printf("1\r\n"); } } return 0; }
-
反汇编分析
- while
-
//00CD2FF3 mov dword ptr[i], 0 //00CD2FFA cmp dword ptr[i], 0Ah //00CD2FFE jg main + 3Ch(0CD301Ch) //00CD3000 mov eax, dword ptr[i] //00CD3003 push eax //00CD3004 push offset string "x" (0D6BE58h) //00CD3009 call _printf(0CCE2CDh) //00CD300E add esp, 8 //00CD3011 mov eax, dword ptr[i] //00CD3014 add eax, 1 //00CD3017 mov dword ptr[i], eax //00CD301A jmp main + 1Ah(0CD2FFAh) int i = 0; while (i <= 10) { printf("%d \r\n", i); i++; }
-
- do...while
-
// 00CD301C mov dword ptr[i], 0 // 00CD3023 mov eax, dword ptr[i] // 00CD3026 push eax // 00CD3027 push offset string "x" (0D6BE58h) // 00CD302C call _printf(0CCE2CDh) // 00CD3031 add esp, 8 // 00CD3034 mov eax, dword ptr[i] // 00CD3037 add eax, 1 // 00CD303A mov dword ptr[i], eax // 00CD303D cmp dword ptr[i], 0Ah // 00CD3041 jle main + 43h(0CD3023h) i = 0; do { printf("%d \r\n", i); i++; } while (i <= 10);
-
- for
-
//00CD3043 mov dword ptr[ebp - 8], 0 起始表达式 //00CD304A jmp main + 75h(0CD3055h) //00CD304C mov eax, dword ptr[ebp - 8] 末尾循环体 //00CD304F add eax, 1 //00CD3052 mov dword ptr[ebp - 8], eax //00CD3055 cmp dword ptr[ebp - 8], 0Ah 条件表达式 //00CD3059 jg main + 8Eh(0CD306Eh) //00CD305B mov eax, dword ptr[ebp - 8] //00CD305E push eax //00CD305F push offset string "x" (0D6BE58h) //00CD3064 call _printf(0CCE2CDh) 函数调用 //00CD3069 add esp, 8 //00CD306C jmp main + 6Ch(0CD304Ch) for (int i = 0; i <= 10; i++) { printf("%d \r\n", i); }
-