判断与分支语句——C语言程序设计(二)

C语言程序设计(二)

判断(if)

if(条件成立){

......

};

⼀个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果不是零,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。(则逻辑表达式结果为0就是条件不成立;不为0就是条件成立)
if ( total > amount )
total += amount+10;

if语句这⼀行结束的时候并没有表示语句结束的“;”,而后面的赋值语句写在if的下一行,并且缩进了,在这⼀行结束的时候有一个表示语句结束的“;”。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定它是否要被执行。

判断的条件

条件
  • 计算两个值之间的关系,所以叫关系运算符
运算符意义
==相等
!=不相等
>大于
>=大于或等于
<小于
<=小于或等于
关系运算的结果
  • 当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0

  • 比如:printf("%d\n", 5==3); 输出结果为0 printf("%d\n", 5>3); 输出结果为1

优先级
  • 所有的关系运算符的优先级比算术运算的低,但是比赋值运算符的高
  • 7 >= 3+4 ; int r = a>0;

注释(/* */)

  • 延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列”/*" 开始,而以"*/"结束。
  • 也可以用一行内注释
int ak = 47/* 36*/, y = 9
  • 也可以用//来注释一行
//初始化
int a = 0;
int b = 1;

否则(else)

if(条件成立){     //条件成立时输出的结果
    ........
}else{.......}  //条件不成立时输出的结果

嵌套的if

嵌套的判断

  • 当if的条件满足或者不满足的时候要执行的语句也可以是⼀条ifif-else语句,这就是嵌套的if语句

  • else 总是和最近的那个if匹配

  • if(条件一)
        if(条件二)
            printf(......);
         else
             printf(......);
    	else
            printf(......);
     
    
  • tips : ① 在 if 或 else 后面总是用{} ② 即使只有一条语句的时候;

级联的 if - else if

if(exp1)
    stl;
else if(exp2)
    st2;
else
    st3;

if语句常见错误

  • 忘记大括号{}

    • if (age >12)
          salary = salary * 1.2;
      	printf("%f",salay);
      
    • 不管这个 if 判断是否成立都会执行 printf 这行语句,如果需要判断成立再执行则需要加个大括号

    • if (age >12){
          salary = salary * 1.2;
      	printf("%f",salay);
      }
      
    • 注意:在c语言的编译器中,缩进、空格和回车并不能将后面的语句划分到前面那句,即不会理会缩进、空格和回车带来的后果。大部分都是用分号;或者大括号{} 来划分语句, python 语言不同, 他们是严格按照缩进来进行语句划分而不会使用分号来划分。

  • 永远在if和else后面加上大括号{},即使只有一条语句

  • if后面的分号

    • if()后面不接分号,接分号则表示条件成立什么也不做,这样没有意义。
  • 错误使用==和=

    • == 等于 ; = 赋值
    • if只要求()里面的值是零或非零;即括号内逻辑表达式的结果
  • 使人困惑的else

    • else总是和最近的那个if匹配

    • if(a > 0){
          if (b<1)
          printf(a);
      }else{
          printf(b);
      }
      
    • 带大括号{}的if,else跟大括号的if

    • if(a>0)
          if(b<1)
              printf(a);
      else
          print(b);
      
    • if没带大括号,则 else 跟最近的 if 匹配

代码风格习惯

  • if和else之后必须加上大括号形成语句块;(虽然单个语句可以不加括号,但为了代码的规范化还是要加上大括号形成语句块, 其次防止出错)

  • 大括号内的语句缩进一个Tab键的位置;

    三种风格代码

    第一种 :

    if ( x<0 ){
        f = -1;
    }else if( x == 0){
    	f = 0;
    }else{
        f = 2 * x;
    }
    
    • 早期电脑的显示器因为长度不够,为了尽可能显示更多行代码的内容而采用的代码风格

    第二种 :

    if ( x<0 )
    {
        f = -1;
    }else if( x == 0)
    {
    	f = 0;
    }else
    {
        f = 2 * x;
    }
    

    第三种 :

    if ( x<0 )
    {
        f = -1;
    }
    else if( x == 0)
    {
    	f = 0;
    }
    else
    {
        f = 2 * x;
    }
    
    • 第二种和第三种的主要区别在于注释掉代码时,第三种不会影响代码的逻辑关系

    举个栗子 :

    //第二种:
    if ( x<0 )
    {
        f = -1;
    //}else if( x == 0)       //即后面少了}括号
    //{
    //	f = 0;
    }else
    {
        f = 2 * x;
    }
    
    
    
    //第三种:
    
    
    if ( x<0 )
    {
        f = -1;
    }
    //else if( x == 0)       //这样并不会影响代码的语法
    //{
    //	f = 0;
    //}
    else
    {
        f = 2 * x;
    }
    

多路分支(switch-case)

switch(控制表达式){
    case 常量:
        语句;
        .....;
    case 常量:
        语句;
        .....;
    default:
        语句;
        ......;
}
switch-case
  • 控制表达式只能是整数型(int)的结果

    • 也可以用常量整数型量 如: const int a = 2; case a :

      注:C99才能用,C99之前的编译器不能用

  • 常量可以是常数,也可以是常数计算的表达式

  • 根据表达式的结果,寻找匹配的case,并执行case后面的语句,⼀直到break为止

  • 如果所有的case都不匹配,那么就执行default后面的语句;如果没有default,那么就什么都不做

break
  • switch语句可以看作是⼀种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的 case(分支标号)处。分支标号只是说明 switch 内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止

举个栗子:

if (type == 1){
    printf("你好");
}else if(type == 2){
	printf("早上好");
}else if(type == 3){
    printf("晚上好");
}else if(type == 4){
    printf("再见");
}else{
    printf("啊你个头啊");
}

用switch-case表示

switch(type){
    case 1:
    	printf("你好");
        break;
    case 2:
		printf("早上好");
        break;
	case 3:
    	printf("晚上好");
        break;
    case 4:    
    	printf("再见");
    default:
    	printf("啊你个头啊");
}
  • if-else和switch-case区别

    • if-else 是从上到下的语句进行判断, 其判断可以不是整型的结果
    • 而switch并不是从第一个到第n个case这样进行判断,而是直接可以到第n个的情况那里输出(可以进行断点调试看看其跳转情况)
  • 还有一个误区,就是为啥不一直写if, if, if…, 而是要写if, else if, else if, …, else.

    • 原因是if, if, if他们是没有关联的判断,而if, else if, …, else是在前面那些if的基础上再进行判断, 是有关联的(他们的关系更多像补集的关系)。

练习

f(x) = -1; x<0

f(x) = 0; x = 0

f(x) = 2x; x>0

这个分段函数能否用switch-case?

int a = 0;
	int b = 0;
	a = x >0;
	b = x <0;
	switch (a - b){ 
	case -1:
		printf("f(x)=%d\n",-1);
		break; 
	case 1:
		printf("f(x)=%d\n",2*x);
		break; 
	default:
		printf("f(x)=%d\n",0);
		break; 
	}
	return 0;
}

其中a = x>0

b = x<0

关系运算符的优先级比赋值运算符的高

若x>0则运算结果为1,否者为0赋值给a (相当于True和False;1,0)

若x<0则运算结果为1,否者为0赋值给b (相当于True和False;1,0)


可忽略

  • switch的汇编代码

请添加图片描述


if-else的汇编代码

请添加图片描述


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值