C语言中的循环与条件控制语句

循环结构

C语言提供了多种循环结构,常见的有 whiledo-whilefor 循环。

  1. while 循环

while 循环在每次迭代开始之前检查条件。如果条件为 false,循环体不会执行。

/* while.c */

#include <stdio.h>

void main()
{
  int test = 10;
  while( test > 0 )
  {
    printf( "test = %d\n", test );
    test = test - 2;
  }
}

如果 test 初始值小于或等于 0,则 while 循环一次也不会执行。

  1. do-while 循环

do-while 循环至少执行一次循环体,因为条件检查在循环体之后。

/* do.c */

#include <stdio.h>

void main()
{
  int test = 10;
  do 
  {
    printf( "test = %d\n", test );
    test = test - 2;
  }
  while( test > 0 );
}
  1. for 循环

for 循环是一种更加紧凑的循环形式,用于实现与 while 类似的逻辑。

/* for.c */

#include <stdio.h>

void main()
{
  int test;
  for( test = 10; test > 0; test = test - 2 )
  {
    printf( "test = %d\n", test );
  }
}

for 循环的语法结构为:

for( <初始化表达式>; <条件测试>; <修改表达式> )

所有括号中的元素均为可选。如果省略所有内容,可以创建无限循环:

for( ; ; )
{
  ...
}

或者使用更清晰的无限循环:

while( 1 )
{
  ...
}

多个表达式: 可以使用 , 操作符在初始化或修改部分添加多个表达式:

/* formax.c */

#include <stdio.h>

void main()
{
  int a, b;
  for ( a = 256, b = 1; b < 512 ; a = a / 2, b = b * 2 )
  {
    printf( "a = %d  b = %d\n", a, b );
  }
}

条件测试

C中的条件测试操作符如下:

表达式 含义
a == b 等于
a != b 不等于
a < b 小于
a > b 大于
a <= b 小于或等于
a >= b 大于或等于

需要注意,== 用于相等测试,而 = 是赋值操作符。这是C编程中常见的错误来源:

a == b  // 判断 a 是否等于 b
a = b   // 将 b 的值赋给 a

条件控制语句

  1. if 语句

if 用于根据条件执行代码块。例如:

/* if.c */

#include <stdio.h>
#define MISSILE 1

void fire( int weapon );

void main()
{
  fire( MISSILE );
}

void fire( int weapon )
{
  if( weapon == MISSILE )
  {
    printf( "Fired missile!\n" );
  }
  if( weapon != MISSILE )
  {
    printf( "Unknown weapon!\n");
  }
}

输出结果:

Fired missile!
  1. if-else 语句

使用 else 可以简化逻辑:

/* ifelse.c */

void fire( int weapon )
{
  if( weapon == MISSILE )
  {
    printf( "Fired missile!\n" );
  }
  else
  {
    printf( "Unknown weapon!\n");
  }
}

如果每个分支仅包含一条语句,可以省略花括号:

void fire( int weapon )
{
  if( weapon == MISSILE )
    printf( "Fired missile!\n" );
  else
    printf( "Unknown weapon!\n" );
}

尽管可以省略花括号,推荐保留它们以提高代码可读性,特别是在需要添加新语句时可以避免错误。


总结

  • 循环结构:whiledo-whilefor 提供了灵活的迭代机制。for 更紧凑,但适用场景与 while 类似。
  • 条件测试:了解不同的比较运算符,并避免混淆 ===
  • 条件控制:通过 ifif-else 实现程序的分支逻辑。花括号虽然是可选的,但推荐使用以确保代码清晰且易于维护。

C语言中的控制结构与操作符

嵌套的 if 语句

C语言没有 elseif 关键字,但可以通过嵌套 if 语句实现类似功能。例如:

/* nestif.c */

#include <stdio.h>
#define MISSILE 1
#define LASER 2

void fire( int weapon );

void main()
{
  fire( LASER );
}

void fire( int weapon )
{
  if( weapon == MISSILE )
  {
    printf( "Fired missile!\n" );
  }
  else
  {
    if( weapon == LASER )
    {
      printf( "Fired laser!\n" );
    }
    else
    {
      printf( "Unknown weapon!\n");
    }
  }
}

这种方式虽然可行,但显得笨拙。


switch 语句

switch 语句可以更简洁地实现多分支判断。例如:

/* switch.c */

void fire( int weapon )
{
  switch( weapon )
  {
  case MISSILE:
    printf( "Fired missile!\n" );
    break;
  case LASER:
    printf( "Fired laser!\n" );
    break;
  default:
    printf( "Unknown weapon!\n");
    break;
  }
}

特点:

  1. switch 只能测试单个变量的值,无法测试多个条件。
  2. default 是可选的,用于处理未被其他分支覆盖的情况。
  3. 每个 case 通常以 break 结束,跳出 switch 语句。漏写 break 可能导致执行流继续到下一个分支。

利用跳过特性:

若某些分支需要共享逻辑,可以省略 break

void fire( int weapon )
{
  switch( weapon )
  {
  case ROCKET:
  case MISSILE:
    printf( "Fired missile!\n" );
    break;
  case LASER:
    printf( "Fired laser!\n" );
    break;
  default:
    printf( "Unknown weapon!\n");
    break;
  }
}

break 语句

break 可用于退出循环或 switch 语句。例如:

/* break.c */

#include <stdio.h>

void main()
{
  int n;
  for( n = 0; n < 10; n = n + 1 )
  {
    if( n == 5 )
    {
      break;  /* 当 n 为 5 时退出循环。 */
    }
    else
    {
      printf( "%d\n", n );
    }
  }
}

如果循环嵌套在其他循环中,break 仅会退出当前循环,而不会影响外层循环。


continue 语句

continue 会跳过循环体的剩余部分,直接开始下一次迭代。例如:

/* continue.c */

#include <stdio.h>

void main()
{
  int n;
  for( n = 0; n < 10; n = n + 1 )
  {
    if( n == 5 )
    {
      continue;  /* 跳过 n = 5 的输出。 */
    }
    else
    {
      printf( "%d\n", n );
    }
  }
}

输出:

0
1
2
3
4
6
7
8
9

goto 语句

goto 可以跳转到函数中的任意标签:

goto punchout;
...
punchout:

虽然 goto 能实现灵活的控制流,但因容易导致代码难以维护,因此通常被认为是不良实践。


条件运算符 ?:

C语言提供了一个特殊的条件运算符,用于简化条件赋值。例如:

if( a == 5 )
{
  b = -10;
}
else
{
  b = 255;
}

可以用更简洁的三元运算符表示:

b = ( a == 5 ) ? -10 : 255 ;

特点:

  1. 三元运算符 ?: 被称为三元操作符,因为它需要三个操作数。
  2. 语法格式为:条件表达式 ? 表达式1 : 表达式2。当条件为 true 时,执行 表达式1,否则执行 表达式2

总结

  • 嵌套 if 虽然灵活,但容易显得冗长。switch 提供了一种更简洁的多分支解决方案。
  • 使用 breakcontinue 控制循环的执行,但应谨慎使用以避免破坏代码的可读性。
  • 条件运算符 ?: 提供了简洁的条件赋值语法,但可读性略逊于传统 if-else 结构。
  • 避免使用 goto,除非有非常明确的理由。
最后修改: 2025年01月27日 星期一 23:13