C语言——选择结构

选择结构和条件判断

(一)if语句——实现两个分支

if 语句可以写成不同形式

  1. if (表达式) 语句1——可以没有else语句
  2. if (表达式)
    语句 1
    else
    语句 2
    ——————————有else语句
  3. if (表达式 1) 语句 1
    else if (表达式 2) 语句 2
    else if (表达式3) 语句 3
    … …
    ———————————可以使用嵌套
    注意:
    (1)如果语句 1,语句 2,,,是复合语句,应该使用花括号括起来。即写成一个代码块。
    (2)内嵌语句可以是 if 语句 ,如果不使用花括号的话, else与最近的 if 相匹配。最好写成代码块形式。
    举例如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int a = 0;
 int b = 1;
 
 if (1 == a)
    if (b == 1)
  printf("bbbbbb");
 else
  printf("aaaaaa");                  //主观感觉输出应该为aaaaaa,
                           //实际上else与最近的if相匹配,所以什么也不输出

 system("pause");
 return 0;
}

运行结果如下:
在这里插入图片描述
(3)if语句后的表达式如果是判断表达式中的等于的话,最好将用于比较的值放在左边,防止写成赋值表达式。这样的话写错的话容易报错。
如:

 int main()
{
 int a = 0;
 if (0 == a)                //如 此处如果写 a == 0的话就容易写成 a = 0
  printf("%d", a);
 system("pause");
 return 0;
}

(4)C语言中0表示假,非0表示真。
所以if 后面的表达式可以是一个变量。
(5)if语句的书写规范

  • bool值和0比较
    bool表示真假,只有 true 和 false
    在C语言中bool值的语义是 0为假,非0为真,true和false这些标识符在C中一定会被定义为一个固定值。
    flag是个整数,可以被赋值为非0整数表示真。
    在表达式中不能写成 if(flag == true)
    原因是:如果flag本身是5,非0,表示真,true为3的话,flag == true为假,则表达式假。
    错误代码如下:
 int flag;
 if (flag == TRUE);
 {
  printf("TRUE");
 }
 if (flag == FALSE)
 {
  prirntf("FALSE");
 }

正确 形式应该为

 if (flag);
 {
  printf("TRUE");
 }
 if (!flag)
 {
  prirntf("FALSE");
 }
  • 整型变量和0比较
    如果一个变量就是整型,(不表示真假)则这个数不能和0比较
int num = 0;
//正确写法
if(0 == num)

//错误写法
if(num)      //如果num本身是0的话,则该语句判断为假,就不能执行if语句



(5)if(表达式1)语句 1 else 语句 2
等价于
表达式1 ? 表达式 2 : 表达式3


举例代码如下:

 int main()
{
 int max = 0;
 int a = 1;
 int b = 2;
 if (a > b)
 {
  max = a;
   }
 else
 {
  max = b;
 }
 system("pause");
 return 0;
}

该代码等价于以下代码

 int main()
{
 int max;
 int a = 1;
 int b = 2;
 max = (a > b) ? a: b;
 system("pause");
 return 0;
}

(二)switch语句——实现多分支

switch语句的一般形式
switch(表达式)
{
case 常量1:语句 1
case 常量2:语句 2
case 常量3:语句 3

default : 语句n
}


· switch 后面的表达式为整数类型,包括字符型,不能为字符串。

· case 后面可以跟一个常量或常量表达式,用来标志一个位置。
执行switch语句时,先计算表达式的值,然后将该值与case后的标号比较,如果相同,则转到该case后的语句,如果不相同,则与后一个case判断,如果没有相匹配的case,则执行default标号后的语句。
·可以没有default语句,如果没有相匹配的case,则执行switch后的下一个语句。
· 各case标号与default标号顺序没有影响。
· 每一个case常量必须不相同,不能出现一个表达式的值有两种及以上执行方案。
· 一般,每个case子句后,应该用一个break语句跳出switch结构。
否则会一直执行下去。


举例如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch (n)
 {
 case 1:
  printf("今天是星期一\n");
  break;
 case 2:
  printf("今天是星期二\n");
  break;
 case 3:
  printf("今天是星期三\n");
  break;
 case 4:
  printf("今天是星期四\n");
  break;
 case 5:
  printf("今天是星期五\n");
  break;
 case 6:
  printf("今天是星期六\n");
  break;
 case 7:
  printf("今天是星期天\n");
  break;
 default:
  break;
 }
 system("pause");
 return 0;
}

运行结果如下
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch (n)
 {
 case 1:
  printf("今天是星期一\n");
 case 2:
  printf("今天是星期二\n");
 case 3:
  printf("今天是星期三\n");
 case 4:
  printf("今天是星期四\n");
 case 5:
  printf("今天是星期五\n");
 case 6:
  printf("今天是星期六\n");
 case 7:
  printf("今天是星期天\n");
 default:
  ;
 }
 system("pause");
 return 0;
}

运行结果如下
在这里插入图片描述

· 多个case标号可以公用一个执行语句

举例如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch (n)
 {
 case 1:
 case 2:
 case 3:
 case 4:
 case 5:
  printf("今天是工作日\n");
  break;
 case 6:
 case 7:
  printf("今天是休息日\n");
  break;
 default:
  break;
 }
 system("pause");
 return 0;
}

运行结果如下
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xmfjmcwf/article/details/83624239