【C语法学习】for循环语句

文章目录

  • 1 语法结构
  • 2 示例
    • 2.1 示例1
    • 2.2 示例2
  • 3 总结与建议
    • 3.1 for与while的不同
    • 3.2 建议

1 语法结构

for语句的语法结构如下图所示:

for(表达式1;表达式2;表达式3)
	循环语句;

语法结构说明

  1. 表达式1:可以是任意有效的C表达式,一般是对循环变量赋初值,甚至可以为空,为空时分号不能省略;
  2. 表达式2:可以是任意有效的C表达式,一般是对循环条件表达式求值;
  3. 表达式3:可以是任意有效的C表达式,一般是更新循环变量的值,甚至可以为空;

循环执行流程图

【C语法学习】for循环语句_第1张图片
循环执行过程

  1. 循环变量赋初值,整个for循环执行期间只执行一次;
  2. 循环条件表达式求值;
  3. 如果循环条件表达式求值结果为假,则结束整个for循环;
  4. 如果循环条件表达式求值结果为真,则执行循环语句;
  5. 更新循环变量的值;
  6. 跳到第2步继续执行;
  7. 如果循环语句中有break,则结束整个for循环;
  8. 如果循环语句中有continue,则跳过continue后面的所有语句,跳到第5步继续执行。

常见使用情况

for语句非常灵活:
1. 向上计数
	for(i = 0; i < 10; i++) 
	{
		statements;
	}
2. 向下计数
	for(i = 10; i > 0; i--) 
	{
		statements;
	}
3. 表达式1为空,分号不可省略
	i = 0;
	for( ; i < 10; i++)
	{
		statements;
	}
4. 表达式可以是任意有效的C表达式
	i = 0;
	for(printf("Hello world"); i < 10; i++)
	{
		statements;
	}
5. 表达式3为空,循环变量的更新放在循环语句中
	for(i = 0; i < 10; )
	{
		statements;
		i++;
	}
6. 表达式2可以是任意有效的C表达式,可以逻辑运算符构建复杂的循环条件表达式
	for(i = 0; i < 10 && arr[i] != 0; i++)
	{
		statements;
	}
7. 表达式1和表达式3可以是逗号表达式	
	for(i = 0, j = 9; i < 10; i++, j--)
	{
		arrb[j] = arra[i]; //将数组a倒序拷贝给数组b
	}
8. 循环语句可以为空语句
	for(i = 0; i < 10; arr[i++] = 50)
	{
		;
	}	
9. for循环支持嵌套	
	for(i = 0; i < 10; i++)
	{
		for(j = 0; j < 10; j++)
		{
			statements;
		}	
	}	
10. 表达式2不能为空,否则程序会认为循环条件恒成立,从而进入死循环状态		
	for(;;)
	{
		statements;
	}	

2 示例

2.1 示例1

希望打印数字1-10,代码如下图所示:

int main()
{
   int i = 0;

   for (i = 1; i <= 10; i++)
   {
      printf("i= %d\n", i);
   }

   return 0;
}

代码执行结果如下图所示:
【C语法学习】for循环语句_第2张图片
如果希望打印数字1-4,可在循环语句中加入break,代码如下图所示:

int main()
{
   int i = 0;

   for (i = 1; i <= 10; i++)
   {
      if (5 == i)
      {
         break;
      }
      printf("i = %d\n", i);
   }

   return 0;
}

代码执行结果如下图所示:
【C语法学习】for循环语句_第3张图片
如果希望跳过打印数字5,在循环语句中加入continue,代码如下图所示:

int main()
{
   int i = 0;

   for (i = 1; i <= 10; i++)
   {
      if (5 == i)
      {
         continue;
      }
      printf("i = %d\n", i);
   }

   return 0;
}

代码执行结果如下图所示:
【C语法学习】for循环语句_第4张图片
注意:for循环遇到continue会跳到表达式3继续执行,所以不会像while循环一样进入死循环跳不出来。

2.2 示例2

使用嵌套for循环打印9次"hello",代码如下图所示:

int main()
{
   int i = 0;
   int j = 0;
   for (i = 0; i < 3; i++)
   {
      for (j = 0; j < 3; j++)
      {
         printf("hello\n");
      }      
   }

   return 0;
}

代码执行结果如下图所示:
【C语法学习】for循环语句_第5张图片
假如我们将循环变量的初始化放在循环外边,省略表达式1,代码如下图所示:

int main()
{
   int i = 0;
   int j = 0;
   for (; i < 3; i++)
   {
      for (; j < 3; j++)
      {
         printf("hello\n");
      }
   }

   return 0;
}

代码执行结果如下图所示:
【C语法学习】for循环语句_第6张图片
省略表达式1后,只打印3次"hello",不满足要求。原因是:

  1. 外层for循环第1次执行完成之后,内层for循环执行3次,打印3次"hello",循环变量i=1,j=3;
  2. 外层for循环第2次执行开始之时,内层for循环因缺少循环变量初始化语句,以至j=3始终保持不变,循环条件j<3无法满足,循环语句不再执行。

3 总结与建议

3.1 for与while的不同

  1. 相对于while循环,for循环的三个表达式1/2/3更集中,便于阅读和修改;
  2. 相对于while循环,for循环的continue跳转位置不同,导致代码执行结果也不同;

3.2 建议

  1. 建议不要省略表达式1和表达式3,即将表达式1放在for循环外,将表达式3放在循环语句中;
  2. 绝对不能省略表达式2,如果省略的化,意味着循环条件恒成立,会造成死循环。

你可能感兴趣的:(C语法学习,c语言)