C语言学习笔记2:分支和循环

分支

if语句

if

基本语法形式:

if(表达式)

        语句;

表达式为真(非0)则执行语句,表达式为假(0)则语句不执行

例如:判断一个整数是否为奇数

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d",&num);
    if(num % 2 == 1)
        printf("%d是奇数",num);
return 0;
}

else

上述问题改为判断一个整数的奇偶性,这时就需要 if...else...语句了

基本语法形式为:

if(表达式)

        语句1;

else(表达式)

        语句2;

#include <stdio.h>
int main()
{
    int num = 0;
    scanf("%d",&num);
    if(num % 2 == 1)
        printf("%d是奇数",num);
    else
        printf("%d是偶数",num);//添加else即可实现,
return 0;
}

分支中包含多条语句

一个if语句只能控制一条语句,如果想要控制多条语句,则需要“{}”将其括起来,else也可以用“{}”将语句括起来

#include <stdio.h>
int main
{
    int age = 0;
    scanf("%d\n",age);
    if(age >= 18)
    {    printf("成年了\n");
         printf("可以开房了\n");
    }
    else
    {
     printf("未成年\n");
     printf("不能开房嗷\n");
    }
return 0;
}

如果没用{}括起来就会出现10岁未成年可以开房了的尴尬局面

嵌套if

例如:输入一个整数,判断输入的整数是正数还是非正数

这是两种写法,更推荐写法一,看着更加爽朗

接下来练习一个更复杂的
输入一个人的年龄
如果<18岁,打印少年
如果在18岁到44岁之间,打印青年
如果在45岁到59岁之间,打印中老年
如果在60岁到89岁之间,打印老年
如果在90岁之上,打印寿星
#include <stdio.h>
int main
{
    int age = 0;
    scanf("%d",&age);
    if(age < 18)
        printf("少年\n");
    else if(age <= 44)
         printf("青年\n");
    else if(age <= 59)
        printf("中老年\n");
    else if(age <= 90)
        printf("老年");
    else
        printf("寿星");
return 0;
}

这是加上大括号的版本

悬空else

有多个if和else时,else总是和最近的if匹配

#include <stdio.h>
int main()
{
         int a = 0;
        int b = 3;
        if(a==1)
             if(b==3)
                     printf("1\n");
        else
            printf(“2\n");
return 0;
}

   这段代码的运行结果是什么?答案是什么都不输出。

为什么?这是代码排版的问题,如果在vs编译器上这个else应该回合第二个if对齐,其实就是else与最近的if相匹配。现在分析,进入第一个if进行判断,成立之后才会有下面的内容,而此时已经不成立,所以直接出,执行结果,没有内容可以打印,程序运行结束,如果想要else和第一个if匹配,则需要{}

#include <stdio.h>
int main()
{
        int a = 0;
        int b = 3;
        if(a==1)
        {
            if(b==3)
                printf("1\n");
        }
        else
        {    
            printf(“2\n"); 
        }
    return 0;
}

关系操作符

>        >=        <        <=        ==相等(要区别于“=”,这是赋值操作符)        !=不相等

当变量和常量比较相等关系时,将变量写在等号右边

if(1 == x)

//如果不小心写成if(x = 1)编译器会报错,很容易发现错误

还有个需要避免的错误:多个关系操作符不宜连用

例如:

按照正常理解,hhh不应该打印,为什么呢?

其实编译器是执行下述表达式

(a < b) < c

由此我们引出逻辑操作符

逻辑操作符

!:逻辑取反操作符(改变单个表达式真假)

&& :并且(两侧表达式都为真,则为真,否则为假)

|| :或者(两侧至少有一个表达式为真,则为真,否则为假)

逻辑判断关系大家高中数学都有所学习,这里不过多赘述

条件操作符

又叫三目操作符,接受三个操作数,形式如下:

表达式1 ? 表达式2 : 表达式3

如果表达式1为真,则表达式2计算,表达式3不计算,表达式2是整个表达式的结果

如果表达式1为假,则表达式3计算,表达式2不计算,表达式3是整个表达式的结果

例如:使用条件操作符找两个数中的最大值

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d",&a,&b);
    int max = (a > b ? a : b);
    printf("%d\n",max);
return 0;
}

到这里,做个练习:输入年份year,判断是否为闰年

闰年判断规则:1 能被4整除且不能被100整除是闰年

                          2 能被400整除是闰年

分析:1 和 2是或者的关系用 || 1中是并且的关系用 &&

#include <stdio.h>
int main()
{
    int year = 0;
    scanf("%d", &year);
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        printf("%d是闰年",year);
    else
        printf("%d不是闰年", year);
return 0;
}

短路

C语言逻辑操作符总是先对左侧的表达式求值,再对右边表达式求值

如果左边表达式满足了逻辑操作符的条件,就不再对右边表达式求值了,此情况称为短路

短路求值:

a && b      a == 0,整个式子已经为假,后边不再计算

a || b         a为真,整个式子已经为真,后边不再计算

switch语句

基本语法形式

switch(整型表达式)

//注意:字符是以ASCII形式存储,ASCII码值是整型,则字符属于整型

{

case 常量表达式1: 语句组1;  //case与后边数字必须要有空格

csae 常量表达式2: 语句组2 ;

case 常量表达式3: 语句组3 ;

//case只决定程序入口,每一个case语句执行完后,加上break才能跳出这个switch语句

}

看个例子:计算一个数除以2之后的余数

这个就是上述case只能决定入口,出口需要break

修改之后就没有问题了

default

对于switch后的整型表达式无法匹配case中的常量表达式时,需要在后面加default

在软件开发中,这个很重要,要提示用户输入正确的符合要求的数据,scanf后同理,只要有scanf,后面加一个检查对错很重要

default和case在switch语句中并没有顺序要求,一切根据需求出发

循环

while循环

基本语法形式:

while(表达式)

        语句;

//和if语句形式相同,但while可实现循环效果

//        if(表达式)

                语句;

例如:打印1至10的数字

#include <stdio.h>
int main()
{
    int i = 1;//初始化
    while(i <= 10)//判断
    {
        printf("%d ",i);
        i++;//调整
    }
return 0;
}

for循环

基本语法形式:

for(表达式1; 表达式2; 表达式3)

//表达式1用于初始化变量

//表达式2用于循环结束条件的判断

//表达式3用于变量调整

例如:打印1至10的数字

#include <stdio.h>
int main()
{
    int i = 1;
    for(i=1; i<=10; i++)
    printf("%d ", i);
 }
 return 0; 

do while循环

基本语法形式:

do

        语句;

while(表达式);

一上来先执行循环语句,所以循环体至少执行一次,再判断表达式是否为真

同样打印1到10的数字

#include <stdio.h>
int main()
{
    int i = 1;
    do
    {    printf("%d ",i);
        i++;
    }
    while(i <= 10);
return 0;
}

break和continue

break的作用是永久终止循环,跳出循环体,执行循环体外的语句

continue的作用是跳过本次循环continue后的代码

while中的break和continue

例如还是用上面的代码

#include <stdio.h>
int main()
{
    int i = 1;//初始化
    while(i <= 10)//判断
    {   if(i == 4)
        break;
        printf("%d ",i);
        i++;//调整
    }
return 0;
}
//代码运行结果是123,当i等于5时,就执行break,跳出循环

对于continue

此时陷入了死循环,红色是光标在闪烁,continue跳过本次循环continue后的代码,回去继续判断,i没有操作还是等于4,由此陷入循环

for中的break和continue

同样用上面的代码

#include <stdio.h>
int main()
{
     int i = 1;
     for(i=1; i<=10; i++)
     {
         if(i == 4)
         break;
     printf("%d ", i);
     }
 return 0; 
}//代码运行结果123
#include <stdio.h>
int main()
{
     int i = 1;
     for(i=1; i<=10; i++)
     {
         if(i == 4)
         continue;
     printf("%d ", i);
     }
 return 0; 
}

因为continue后只有printf,所以只跳过4不打印

最后画个流程图做个总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值