一零二零、C语言白菜入门--流程控制
C 语⾔的程序是顺序执⾏,即先执⾏前⾯的语句,再执行后⾯的语句。开发者如果想要控制程序执⾏的流程,就必须使⽤流程控制的语法结构,主要是条件执⾏和循环执行。
目录
if语句
if 语句⽤于条件判断,满⾜条件时,执⾏指定的语句。
if (expression) statement
 
上⾯式⼦中,表达式 expression 为真(值不为 0 )时,就执⾏ statement 语句。
if 后⾯的判断条件 expression 外⾯必须有圆括号,否则会报错。语句体部分 statement 可以是⼀个语句,也可以是放在⼤括号⾥⾯的复合语句。
eg:
if (x == 10) printf("x is 10");
 
如果有多条语句,就需要把它们放在⼤括号⾥⾯,组成⼀个复合语句。
  
   - 
    
     
    
    
     
      if (line_num == MAX_LINES) {
     
    
 
   - 
    
     
    
    
     
       line_num = 0;
     
    
 
   - 
    
     
    
    
     
       page_num++;
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
if 语句可以带有 else 分⽀,指定条件不成⽴时(表达式 expression 的值为 0 ),所要执⾏的代码。
  
   - 
    
     
    
    
     
      if (expression) statement
     
    
 
   - 
    
     
    
    
     
      else statement
     
    
 
  
 
eg:
  
   - 
    
     
    
    
     
      if (i > j)
     
    
 
   - 
    
     
    
    
     
       max = i;
     
    
 
   - 
    
     
    
    
     
      else
     
    
 
   - 
    
     
    
    
     
       max = j;
     
    
 
  
 
如果 else 的语句部分多于⼀⾏,同样可以把它们放在⼤括号⾥⾯。
else 可以与另⼀个 if 语句连⽤,构成多重判断:
  
   - 
    
     
    
    
     
      if (expression)
     
    
 
   - 
    
     
    
    
      statement
     
    
 
   - 
    
     
    
    
     
      else if (expression)
     
    
 
   - 
    
     
    
    
     
       statement
     
    
 
   - 
    
     
    
    
     
      ...
     
    
 
   - 
    
     
    
    
     
      else if (expression)
     
    
 
   - 
    
     
    
    
     
       statement
     
    
 
   - 
    
     
    
    
     
      else
     
    
 
   - 
    
     
    
    
     
       statement
     
    
 
   - 
    
     
    
    
     
      
     
    
 
  
 
如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
  
   - 
    
     
    
    
     
      if (number > 6)
     
    
 
   - 
    
     
    
    
      if (number < 12)
     
    
 
   - 
    
     
    
    
     
       printf("The number is more than 6, less than 12.\n");
     
    
 
   - 
    
     
    
    
     
      else
     
    
 
   - 
    
     
    
    
     
       printf("It is wrong number.\n");
     
    
 
  
 
上⾯示例中, else 部分匹配最近的 if (即 number < 12 ),所以如果 number 等于6,就不会执⾏ else 的部分。
这样很容易出错,为了提供代码的可读性,建议使⽤⼤括号,明确 else 匹配哪⼀个 if 。
  
   - 
    
     
    
    
     
      if (number > 6) {
     
    
 
   - 
    
     
    
    
      if (number < 12) {
     
    
 
   - 
    
     
    
    
     
       printf("The number is more than 6, less than 12.\n");
     
    
 
   - 
    
     
    
    
     
       }
     
    
 
   - 
    
     
    
    
     
      } else {
     
    
 
   - 
    
     
    
    
     
       printf("It is wrong number.\n");
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中,使⽤了⼤括号,就可以清晰地看出 else 匹配外层的 if 。
三元运算符?:
C 语⾔有⼀个三元表达式 ?: ,可以⽤作 if...else 的简写形式。
<expression1> ? <expression2> : <expression3>
 
这个操作符的含义是,表达式 expression1 如果为 true (⾮0值),执⾏ expression2 ,否则执⾏ expression3 。
eg:
(i > j) ? i : j;
 
  
   - 
    
     
    
    
     
      if (i > j)
     
    
 
   - 
    
     
    
    
      return i;
     
    
 
   - 
    
     
    
    
     
      else
     
    
 
   - 
    
     
    
    
      return j;
     
    
 
  
 
上面的代码表达的意思是一样的,返回两个值之中的较⼤值。
switch语句
switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
  
   - 
    
     
    
    
     
      switch (expression) {
     
    
 
   - 
    
     
    
    
      case value1: statement
     
    
 
   - 
    
     
    
    
      case value2: statement
     
    
 
   - 
    
     
    
    
      default: statement
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,就执⾏ default 分⽀。
eg:
  
   - 
    
     
    
    
     
      switch (grade) {
     
    
 
   - 
    
     
    
    
      case 0:
     
    
 
   - 
    
     
    
    
     
       printf("False");
     
    
 
   - 
    
     
    
    
      break;
     
    
 
   - 
    
     
    
    
      case 1:
     
    
 
   - 
    
     
    
    
     
       printf("True");
     
    
 
   - 
    
     
    
    
      break;
     
    
 
   - 
    
     
    
    
      default:
     
    
 
   - 
    
     
    
    
     
       printf("Illegal");
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中,根据变量 grade 不同的值,会执⾏不同的 case 分⽀。如果等于 0 ,执⾏ case 0 的部分;如果等于 1 ,执⾏ case 1 的部分;否则,执⾏ default 的部分。 default 表示处理以上所有 case 都不匹配的情况。
每个 case 语句体的结尾,都应该有⼀个 break 语句,作⽤是跳出整个 switch 结构,不再往下执⾏。如果缺少 break ,就会导致继续执⾏下⼀个 case 或 default 分⽀。
  
   - 
    
     
    
    
     
      switch (grade) {
     
    
 
   - 
    
     
    
    
      case 0:
     
    
 
   - 
    
     
    
    
     
       printf("False");
     
    
 
   - 
    
     
    
    
      case 1:
     
    
 
   - 
    
     
    
    
     
       printf("True");
     
    
 
   - 
    
     
    
    
      break;
     
    
 
   - 
    
     
    
    
      default:
     
    
 
   - 
    
     
    
    
     
       printf("Illegal");
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中, case 0 的部分没有 break 语句,导致这个分⽀执⾏完以后,不会跳出 switch 结构,继续执⾏ case 1 分⽀。
利⽤这个特点,如果多个 case 分⽀对应同样的语句体,可以写成下⾯这样。
  
   - 
    
     
    
    
     
      switch (grade) {
     
    
 
   - 
    
     
    
    
      case 0:
     
    
 
   - 
    
     
    
    
      case 1:
     
    
 
   - 
    
     
    
    
     
       printf("True");
     
    
 
   - 
    
     
    
    
      break;
     
    
 
   - 
    
     
    
    
      default:
     
    
 
   - 
    
     
    
    
     
       printf("Illegal");
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中, case 0 分⽀没有任何语句,导致 case 0 和 case 1 都会执⾏同样的语句体。
case 后⾯的语句体,不⽤放在⼤括号⾥⾯,这也是为什么需要 break 的原因。
default 分⽀⽤来处理前⾯的 case 都不匹配的情况,最好放在所有 case 的后⾯,这样就不⽤写 break 语句。这个分⽀是可选的,如果没有该分⽀,遇到所有的 case 都不匹配的情况,就会直接跳出整个 switch 代码块。
while语句
while 语句⽤于循环结构,满⾜条件时,不断执⾏循环体。
  
   - 
    
     
    
    
     
      while (expression)
     
    
 
   - 
    
     
    
    
     
       statement
     
    
 
  
 
上⾯代码中,如果表达式 expression 为⾮零值(表示真),就会执⾏ statement 语句,然后再次判断 expression 是否为零;如果 expression 为零(表示伪)就跳出循环,不再执⾏循环体。
  
   - 
    
     
    
    
     
      while (i < n)
     
    
 
   - 
    
     
    
    
     
       i = i + 2;
     
    
 
  
 
上⾯示例中,只要 i ⼩于 n , i 就会不断增加2。
如果循环体有多个语句,就需要使⽤⼤括号将这些语句组合在⼀起。
  
   - 
    
     
    
    
     
      while (expression) {
     
    
 
   - 
    
     
    
    
     
       statement;
     
    
 
   - 
    
     
    
    
     
       statement;
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
eg:
  
   - 
    
     
    
    
     
      int i = 0;
     
    
 
   - 
    
     
    
    
     
      while (i < 10) {
     
    
 
   - 
    
     
    
    
     
       printf("i is now %d!\n", i);
     
    
 
   - 
    
     
    
    
     
       i++;
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
   - 
    
     
    
    
     
      printf("All done!\n");
     
    
 
   - 
    
     
    
    
     
      //i is now 0!
     
    
 
   - 
    
     
    
    
     
      //i is now 1!
     
    
 
   - 
    
     
    
    
     
      //i is now 2!
     
    
 
   - 
    
     
    
    
     
      //i is now 3!
     
    
 
   - 
    
     
    
    
     
      //i is now 4!
     
    
 
   - 
    
     
    
    
     
      //i is now 5!
     
    
 
   - 
    
     
    
    
     
      //i is now 6!
     
    
 
   - 
    
     
    
    
     
      //i is now 7!
     
    
 
   - 
    
     
    
    
     
      //i is now 8!
     
    
 
   - 
    
     
    
    
     
      //i is now 9!
     
    
 
   - 
    
     
    
    
     
      //All done!
     
    
 
  
 
 
上⾯代码中,循环体会执⾏10次,每次将 i 增加 1 ,直到等于 10 才退出循环。
只要条件为真, while 会产⽣⽆限循环。下⾯是⼀种常⻅的⽆限循环的写法。
  
   - 
    
     
    
    
     
      while (1) {
     
    
 
   - 
    
     
    
    
      // ...
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯的示例虽然是⽆限循环,但是循环体内部可以⽤ break 语句跳出循环。
do......while结构
do......while结构是 while 的变体,它会先执⾏⼀次循环体,然后再判断是否满⾜条件。如果满⾜的话, 就继续执⾏循环体,否则跳出循环。do while语句是一种出口条件循环,即在执行完循环体后才根据测试条件决定是否再次执行循环,因此,该循环至少必须执行一次。
  
   - 
    
     
    
    
     
      do statement
     
    
 
   - 
    
     
    
    
     
      while (expression);
     
    
 
  
 
上⾯代码中,不管条件 expression 是否成⽴,循环体 statement ⾄少会执⾏⼀次。每次 statement 执⾏完毕,就会判断⼀次 expression ,决定是否结束循环。
  
   - 
    
     
    
    
     
      int i = 10;
     
    
 
   - 
    
     
    
    
     
      do --i;
     
    
 
   - 
    
     
    
    
     
      while (i > 0);
     
    
 
  
 
上⾯示例中,变量 i 先减去1,再判断是否⼤于0。如果⼤于0,就继续减去1,直到 i 等于 0 为⽌。 如果循环部分有多条语句,就需要放在⼤括号⾥⾯。
  
   - 
    
     
    
    
     
      int i = 10;
     
    
 
   - 
    
     
    
    
     
      do {
     
    
 
   - 
    
     
    
    
     
       printf("i is %d\n", i);
     
    
 
   - 
    
     
    
    
     
       i++;
     
    
 
   - 
    
     
    
    
     
      } while (i < 10);
     
    
 
   - 
    
     
    
    
     
      printf("All done!\n");
     
    
 
   - 
    
     
    
    
     
      /*
     
    
 
   - 
    
     
    
    
     
      i is 10
     
    
 
   - 
    
     
    
    
     
      All done!
     
    
 
   - 
    
     
    
    
     
      */
     
    
 
  
 
变量 i 并不满⾜⼩于 10 的条件,但是循环体还是会执⾏⼀次,这就是do...while。
for语句
for 语句是最常⽤的循环结构,通常⽤于精确控制循环次数。
  
   - 
    
     
    
    
     
      for (initialization; continuation; action)
     
    
 
   - 
    
     
    
    
     
       statement;
     
    
 
  
 
for 语句的条件部分(即圆括号⾥⾯的部分)有三个表达式。
- initialization :初始化表达式,⽤于初始化循环变量,只执⾏⼀次。
 - continuation :判断表达式,只要为 true ,就会不断执⾏循环体。
 - action :循环变量处理表达式,每轮循环结束后执⾏,使得循环变量发⽣变化。
 
循环体部分的 statement 可以是⼀条语句,也可以是放在⼤括号⾥⾯的复合语句。
eg:
  
   - 
    
     
    
    
     
      for (int i = 10; i > 0; i--)
     
    
 
   - 
    
     
    
    
     
       printf("i is %d\n", i);
     
    
 
  
 
循环变量 i 在 for 的第⼀个表达式⾥⾯声明,该变量只⽤于本次循环。离开循环体之后,就会失效。
条件部分的三个表达式,每⼀个都可以有多个语句,语句与语句之间使⽤逗号分隔。
  
   - 
    
     
    
    
     
      int i, j;
     
    
 
   - 
    
     
    
    
     
      for (i = 0, j = 999; i < 10; i++, j--) {
     
    
 
   - 
    
     
    
    
     
       printf("%d, %d\n", i, j);
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中,初始化部分有两个语句,分别对变量 i 和 j 进⾏赋值。
for 的三个表达式都不是必需的,甚⾄可以全部省略,这会形成⽆限循环。
  
   - 
    
     
    
    
     
      for (;;) {
     
    
 
   - 
    
     
    
    
     
       printf("本⾏会⽆限循环地打印。\n" );
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例由于没有判断条件,所以形成了⽆限循环。
break语句
break 语句有两种⽤法。⼀种是与 switch 语句配套使⽤,⽤来中断某个分⽀的执⾏,这种⽤法前⾯已经介绍过了。另⼀种⽤法是在循环体内部跳出循环,不再进⾏后⾯的循环了。
  
   - 
    
     
    
    
     
      for (int i = 0; i < 3; i++) {
     
    
 
   - 
    
     
    
    
      for (int j = 0; j < 3; j++) {
     
    
 
   - 
    
     
    
    
     
       printf("%d, %d\n", i, j);
     
    
 
   - 
    
     
    
    
      break;
     
    
 
   - 
    
     
    
    
     
       }
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中, break 语句使得循环跳到下⼀个 i 。
  
   - 
    
     
    
    
     
      while ((ch = getchar()) != EOF) {
     
    
 
   - 
    
     
    
    
      if (ch == '\n') break;
     
    
 
   - 
    
     
    
    
     
       putchar(ch);
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中,⼀旦读到换⾏符( \n ), break 命令就跳出整个 while 循环,不再继续读取了。 注意, break 命令只能跳出循环体和 switch 结构,不能跳出 if 结构。
  
   - 
    
     
    
    
     
      if (n > 1) {
     
    
 
   - 
    
     
    
    
      if (n > 2) break; // ⽆效
     
    
 
   - 
    
     
    
    
     
       printf("hello\n");
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中, break 语句是⽆效的,因为它不能跳出外层的 if 结构。
continue语句
continue 语句⽤于在循环体内部终⽌本轮循环,进⼊下⼀轮循环。只要遇到 continue 语句,循环体内部后⾯的语句就不执⾏了,回到循环体的头部,开始执⾏下⼀轮循环。
  
   - 
    
     
    
    
     
      for (int i = 0; i < 3; i++) {
     
    
 
   - 
    
     
    
    
      for (int j = 0; j < 3; j++) {
     
    
 
   - 
    
     
    
    
     
       printf("%d, %d\n", i, j);
     
    
 
   - 
    
     
    
    
      continue;
     
    
 
   - 
    
     
    
    
     
       }
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中,有没有 continue 语句,效果⼀样,都表示跳到下⼀个 j 。
  
   - 
    
     
    
    
     
      while ((ch = getchar()) != '\n') {
     
    
 
   - 
    
     
    
    
      if (ch == '\t') continue;
     
    
 
   - 
    
     
    
    
     
       putchar(ch);
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
上⾯示例中,只要读到的字符是制表符( \t ),就⽤ continue 语句跳过该字符,读取下⼀个字符。
goto语句
goto 语句⽤于跳到指定的标签名。这会破坏结构化编程,建议不要轻易使⽤,这⾥为了语法的完整,介绍⼀下它的⽤法。
  
   - 
    
     
    
    
     
      char ch;
     
    
 
   - 
    
     
    
    
     
      top: ch = getchar();
     
    
 
   - 
    
     
    
    
     
      if (ch == 'q')
     
    
 
   - 
    
     
    
    
      goto top;
     
    
 
  
 
上⾯示例中,top 是⼀个标签名,可以放在正常语句的前⾯,相当于为这⾏语句做了⼀个标记。程序执⾏到 goto 语句,就会跳转到它指定的标签名。
  
   - 
    
     
    
    
     
      infinite_loop:
     
    
 
   - 
    
     
    
    
     
       print("Hello, world!\n");
     
    
 
   - 
    
     
    
    
      goto infinite_loop;
     
    
 
  
 
上⾯的代码会产⽣⽆限循环,goto 的⼀个主要⽤法是跳出多层循环。
  
   - 
    
     
    
    
     
      for(...) {
     
    
 
   - 
    
     
    
    
      for (...) {
     
    
 
   - 
    
     
    
    
      while (...) {
     
    
 
   - 
    
     
    
    
      do {
     
    
 
   - 
    
     
    
    
      if (some_error_condition)
     
    
 
   - 
    
     
    
    
      goto bail; 
     
    
 
   - 
    
     
    
    
     
       } while(...);
     
    
 
   - 
    
     
    
    
     
       }
     
    
 
   - 
    
     
    
    
     
       }
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      bail:
     
    
 
   - 
    
     
    
    
     
      // ... ...
     
    
 
  
 
上⾯代码有很复杂的嵌套循环,不使⽤ goto 的话,想要完全跳出所有循环,写起来会比较麻烦。
goto 的另⼀个⽤途是提早结束多重判断。
  
   - 
    
     
    
    
     
      if (do_something() == ERR)
     
    
 
   - 
    
     
    
    
      goto error;
     
    
 
   - 
    
     
    
    
     
      if (do_something2() == ERR)
     
    
 
   - 
    
     
    
    
      goto error;
     
    
 
   - 
    
     
    
    
     
      if (do_something3() == ERR)
     
    
 
   - 
    
     
    
    
      goto error;
     
    
 
   - 
    
     
    
    
     
      if (do_something4() == ERR)
     
    
 
   - 
    
     
    
    
      goto error;
     
    
 
  
 
上⾯示例有四个判断,只要有⼀个发现错误,就使⽤ goto 跳过后⾯的判断。
注意,goto 只能在同⼀个函数之中跳转,并不能跳转到其他函数。

文章来源: tuomasi.blog.csdn.net,作者:托马斯-酷涛,版权归原作者所有,如需转载,请联系作者。
原文链接:tuomasi.blog.csdn.net/article/details/125913529
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)