C语言流程控制

一、关系运算、逻辑运算

1.关系运算:

    “关系运算“实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。
    关系表达式都是有值的,它的结果反映的是一种关系是否成立。如果关系成立,则关系表达式的值为真;如果关系不成立,则关系表达式的值为假。C语言中用int型来记录逻辑结果,即"1"(真)和"0"(假)。
   C语言提供以下6种关系运算符:
①<                (小于)
②<=              (小于或等于) 
③>                (大于)
④>=              (大于或等于)
⑤==              (等于)
⑥!=               (不等于)
  关于优先次序:
        (1) 前4种关系运算符(<,<=,>,>=)的优先级别相同,后2种也相同。前4种高于后2种。
        (2) 关系运算符的优先级低于算术运算符。
        (3) 关系运算符的优先级高于赋值运算符。
例: 0 < a < 5在C语言和数学的含义是不同的
在C语言中:
      0<a<5是将(0<a)比较出的结果(0或1)再与5进行比较,得出最终结果0或1。
在数学中:
     0<a<5表示a的值在0到5之间。

2.逻辑运算:

   用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。
C语言提供以下3种逻辑运算符:
 
(1) &&  逻辑与                 (相当于其他语言中的 AND)
(2) ||     逻辑或                   (相当于其他语 中的 OR)
(3) !      逻辑非                    (相当于其他语言中的 NOT)

(1)&&

运算规则:一假则假,全真才真   (双目运算符)

表达式1 && 表达式2

(一般连接两个表达式,反映两个表达式之间的关系)

(2)||

运算规则:一真则真,全假才假  (双目运算符)

表达式1 && 表达式2

(反映的是最终这个表达式的结果)

(3)!

运算规则:真假相对  (单目运算符)

!表达式

(原来表达式为真,!之后这个表达式的结果就为假)

注意: && 和 || 均有短路特性:

&& :如果左边的表达式1的结果为假,右边的表达式2就不会再运算。

   || :如果左边的表达式1的结果为真,右边的表达式2就不会再运算。

3.条件运算:

  它是C语言中唯一的一个三目运算。从语法含义上来看就是 if-else 的简写。
  运算规则:先求解表达式1,若为非 0( 真)则求解表达式 2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为 0( 假),则求解表达式3,表达式3的值就是整个条件表达式的值。
表达式 1? 表达式 2: 表达式 3

例:用条件表达式找出3个数中的最大值

#include<stdio.h>

int main()
{
    int a,b,max;
    scanf("%d %d",&a,&b);

    max = a>b ? a:b;
    
    printf("max=%d\n",max)

    return 0;                                                                                                                       
}

易错:a>b ? max=a : max=b;

在 C 语言中,条件运算符 ? : 的优先级高于赋值运算符 = ,若按照以上错误写法,就会出现

error: lvalue required as left operand of assignment,对于‘=b’来说,左边的整体不是一个左值(lvalue)。

改:方法①a>b ? (max=a) : (max=b);

       方法②max = a>b ? a : b;

二、流程控制

    流程控制包括顺序结构、选择结构、循环结构,任何一个C程序,都是由这三种结构组合而成。

选择结构:

1.if 语句

    if 语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
形式1:处理单个情况-------单分支
形式2:处理两种情况-------双分支
形式3:处理多种情况-------多分支

(1)形式1:(单分支)

  ①语法形式:
if (表达式)
{
        语句
} //复合语句
  ②语义:
      如果,表达式为真,则执行语句,语句执行结束表示 if 语句结束,之后继续执行程序;
      如果,表达式为假,则 if 语句结束,程序继续往下执行。
 
  ③流程图:
65adea9e7fe14a40a82dff453dfb5ce8.png
 
 
 
 
 
 
 
 

(2)形式2:(双分支)

  ①语法形式:

if (表达式)
{
        语句1
else
{
        语句2
}
  ②语义:
      如果,表达式为真,则执行语句1,语句1执行结束表示 if 语句结束,之后继续执行程序;
      如果,表达式为假,则执行语句2,语句2执行结束表示 if 语句结束,程序继续往下执行。
  ③流程图:
509ab1b3252e4d189c99177594b1d5aa.png
 

(3)形式3:(多分支)

①语法形式:

if (表达式1)
{
        语句1
else if (表达式2)
{
        语句2
}
·
·
·
else
{
        语句n
}
②语义:
      如果,表达式1为真,则执行语句1,语句1执行结束表示 if 语句结束,之后继续执行程序;
      如果,表达式1为假,则判断表达式2,如果表达式2为真······  ······,最后程序继续往下执行。
 
  ③流程图:
39c7f3dfc72a4df689b7904fd80174c2.png
注意:1.if(表达式) 后面不能加分号。
           2.else 后面没有表达式。
例1:输入一个年份,判断它是否是闰年
#include<stdio.h>
int main(void)
{int year;
    printf("Input a year:");
    scanf("%d",&year);
 
    if(year%4 == 0 && year%100 != 0 || year%400 == 0)
         printf("is a leap year\n");
    else
         printf("is not a leap year\n");

    return 0;
}

例2:输入一个月份,输出其对应天数

#include<stdio.h>

int main(void)
{
    int year,month,days;
    printf("Input year and month:");
    scanf("%d-%d",&year,&month);
 
    if(month<1 || month >12)
    {
        printf("Invalid month!\n");
        return -1;
    }
  
    if(month==4 || month==6 || month==9 || month==11)
    {
          days = 30;
    }
    else if(month==2)
    {
          if(year%4 == 0 && year%100 != 0 || year%400 == 0)
              days = 29;
          else
              days = 28;
     } 
     else
          days = 31;
      
     printf("days = %d\n",days);
 
     return 0;                                                                                                                        }

注:return -1;

  返回非零值(包括 -1 )通常暗示函数没有正常完成其预期的任务。而返回 0 则常常表示函数正常执行完毕且没有出现错误。

2.switch 语句

①语法形式:

2f4f566ebad54172b57a399d0a3909ca.png

注:1.表达式和常量表达式不是判断条件,只是一个值,需匹配这两个值是否一样。                             2.default 表示如果不是上面的情况,则默认为这一情况。

②语义:
      求解表达式,用表达式结果与下面case后的常量表达式的结果进行匹配,如果匹配成功,则执行对应case下的语句,直到遇到 break 或者是 switch 语句 ‘}’(右花括号)则结束。
 注意:匹配case的只会匹配一次,如果没有 break 将会接着执行常量表达式1、2、3······n,直到              遇到 break 或者是 switch 语句 ‘}’(右花括号)才结束。
 
  ③流程图:
例:
1cb99ce1a0564e209c4f9a9a2667ce01.png
注意:
1.switch后的表达式必须是整型表达式,不能是浮点型。
2.case 后面是一个整型常量表达式,不能是变量。
3.case、default 是标签(label),可以给执行语句起一个标签,用标签来代表这个语句。
4.default 不一定写在最后,但写在中间的时候需要在语句后面加上 break。

例:用switch实现 if 的效果:将分数制转为等级制

#include<stdio.h>
int main(void)
{
    int score,level;
    printf("Input a score:");
    scanf("%d",&score);

    if(score<0 || score>100)
    {
        printf("invalid score!\n");
        return -1;
    }
 
    switch(score/10)                                                                                                                
    {
     case 10:
     case 9:
         level = 'A';
         break;
     case 8:
         level = 'B';
         break;
     case 7:
         level = 'C';
         break;
     case 6:
         level = 'D';
         break;   
     default:
         level = 'E';
    }
    
    printf("level = %c\n",level);
    return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值