C/C++ - 循环结构

目录

WHILE

DO...WHILE

FOR

BREAK

CONTINUE

GOTO

反汇编分析


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);
      	}
      
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值