分支与循环

分支与循环

一. if语句

1. if

语法形式如下:

if (表达式)
   语句

表达式成立在(为真),则语句执行,若表达式不成立(为假),则语句不执行

在c语言中,0为假,非0为真

例子:输入一个整数,判断是否为基数

int main()
{
 int a=0;
 scanf("%d",&a);
 if(a%2==1) //这里的==的意思是判断相等,而一个=的意思是赋值
  printf("是基数");
 return 0
}

2. else

语法形式如下:

if (表达式)
   语句
else
   语句

就拿上面的那个例子继续举例,如果此时需要输入一个整数,判断是否为基数,并且打印是基数或是偶数

int main()
{
 int a=0;
 scanf("%d",&a);
 if(a%2==1) //这里的==的意思是判断相等,而一个=的意思是赋值
  printf("是基数");
 else
  printf("是偶数");
 return 0
}

这时加上这一句else就可以打印出与if相反的结果,因此这两个结合叫做if…else语句

注意:如果编译器在else处报错,则极大的可能性是你的if语句后面加了分号

3.分支中包含多种语句

其实本质规则就是一个if或else不能打印两句,如果想打印两句,则需要把几句用大括号扣住

例子

int main()
{
 int age=0;
 scanf("%d",&age);
 if (age>=18)
 {
     printf("成年了\n");
     printf("可以谈恋爱了\n")}
 else
 {    
     printf("未成年\n")printf("不可以早恋哦\n")}       
 return 0;
}

就像这个例子中printf(“成年了”); printf(“可以谈恋爱了”);这两句本身是不可以同时出现在一个if或else中,但是把他俩用大括号括起来,即可符合语法规定,正常运行

4. 嵌套if

if else 语句中,else可以与另一个if语句连用,构成多重判断

例子:输入一个整数,判断输入的是0,还是正数,还是负数

第一种写法:else里嵌套if

int main()
{
 int a=0;
 scanf("%d",&a);
 if(a==0)
   printf("输入的数字是0\n");
 else
 {
  if (a>0)
  printf("输入的数字是正数")else
  printf("输入的数字是负数")}
return 0;
}

第二种写法:if里嵌套else

int main()
{
 int a=0;
 scanf("%d",&a);
 if (a>=0)
 {
  if(a==0)
   printf("输入的数字是0")else
   printf("输入的数字是正数")}
 else
  printf("输入的数字是负数")return 0;
}

第三种写法(推荐):else if语句,本质就是第一个if结束,但是如果直接使用else再使用嵌套,则太麻烦而且字数太多,使用else if(表达式)语句,可以使代码看起来更方便理解和美观

int main()
{
 int a=0
 scanf("%d",&a);
 if (a==0);
   printf("输出的数字是0")else if(a>=0)
   printf("输出的数字是正数")else
   printf("输出的数字是负数")return 0;
}

5. 悬空else问题

如果有多个if和else,可以记住这一条规则,else总是跟最近的if匹配

例子:

int main()
{
 int a=0;
 int b=0;
 if(a==1)
     if(b==2)
       printf("你好")else
     paintf("我不好")return 0}

这是肯定会有人认为,代码会先判断a是否等于1,如果不等于1,那么会输出我不好

这种想法是错误的,因为else总是跟最近的if匹配,同时上面代码的else放错了位置,这样会造成读者的误解,因此为了让代码可以清楚的别理解,我们可以这样写:

int main()
{
 int a=0;
 int b=0;
 if(a==1)
 {
    if(b==2)
        printf("你好")else
        printf("我不好")}
 return 0;
}

二. 关系操作符

C语⾔⽤于⽐较的表达式,称为“关系表达式”(relational expression),⾥⾯使⽤的运算符就称
为“关系运算符”(relational operator),主要有下⾯6个

⼤于运算符
< ⼩于运算符
= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符

注意1:相等运算符(==)与赋值运算符(=)是两个不一样的运算符,本质就是:==是判断相等,而一个=的意思是赋值

注意2: 多个关系运算符不可以连用。例如 i<j<k 这个式子在写代码时不可出现,正确的表达应该是i<j && j<k,这里解释一下&&的意思是“并且”

三. 条件操作符

定义:条件操作符也叫三目操作符,形式如下

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果exp1为真,则exp2计算,计算结果为整个式子的结果;如果exp1为假,则exp3计算,计算的结果则为整个式子的结果

例子:如果输入一个数字,它大于5则输出数字3,如果它小于或等于5,则输出数字-3

int main()
{
 int a=0;
 int b=0;
 scanf("%d",&a);
 b=a>5 ? 3 : -3;
 printf("%d",b);
 return 0;
}

四. 逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符

! :逻辑取反运算符(改变单个表达式的真假)
&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)
|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)

注:C语⾔中,⾮0表⽰真,0表⽰假

1.逻辑取反运算符 !

ab
非00
01

2.逻辑取与操作符 &&

aba&&b
非0非0非0
非000
0非00
000

&&操作符的·意思是并且,使用方法是a&&b,&&两边的表达式如果都为真,则整个表达式都是真,如果有一边是假,则整个表达式都为假

例子:

int main()
{
 int mounth=0;
 scanf("%d",&month);
 if(mounth>=3 && month <=5)
   printf("春季")return 0:
}

这里的意思就很明显了,month既要大于等于3,又要小于等于5

3.逻辑或操作符 ||

|| 的意思是或者,|| 也是一个双目操作符,使用方法 a||b , ||两边只有有一个真,则整个表达式都为真

例子:用代码体现一年中是12月·或者1月或者2月是冬天

int mian()
{
 int month=0;
 scanf(%d,&month);
 if (month==0||month==1||month==2)
   printf("冬季\n");
}

4.练习:闰年的判断

输入一个年,判断是否是闰年

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

int mian()
{
 int year=0;
 scanf("%d",&year);
 if((year%4==0 && year%100!=0)||(year%400==0))
  printf("是闰年");
return 0; 
}

一开始当我看到这个题时我写的是

if(year%4==0 && year%100!=0)
    printf("闰年");
else if (year%400==0)
    printf("闰年");

这种写法是错误的,因为if else 是分支语句,因此代码只能进行到两者之一,因为if在前,所以进入if就不会出来了,因此else if就失效了。如果想让year%400==0有效,则改为:

if(year%4==0 && year%100!=0)
    printf("闰年");
if (year%400==0)
    printf("闰年");

此处删掉else,改为双if,则可忽略二选一的问题

五. switch语句

除了if语句,c语言还提供了switch语句来实现分支结构

switch语句是一种特殊的if…else结构,用于判断条件有多个结构的情况。他把多重的else if改成更易用,更可读的形式

语法形式

switch(expression)
{
 case 1: statement
 case 2: statement
 default: statement
}

在上面的代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行default分支

注意:

switch后的expression必须是整型表达式

case后的值,必须是整型常量表达式

1. if 语句与switch语句的对比

例子:输入一个整数值,计算除与3之后的余数

使用if

int main()
{
 int a=0;
 scanf("%d",&a);
 if (a%3==1)
   printf("余数是1\n");
 else if (a%3==2)
   printf("余数是2\n")else 
   printf("余数是0\n");
return 0;
}

使用switch

int main()
{
  int a=0;
  scanf("%d",&a);
  switch (a%3)
  {
    case 0:
        printf("余数是0");
        break;
    case 1:
        printf("余数是1")break;
    case 2:
        printf("余数是2")break;
  }
  return 0}  

其实switch语句常用在一个表达式求值,如果遇到范围之类的,还是需要使用if语句

在switch语句中还要注意:

**1. case和后面的数字之间必须要有空格 **

2. 每一个case 语句的代码执行完,都要在后面加上break,这样才能跳出这个循环

2. switch里的default

default其实就是定义一个默认输出结果,如果所有的case都不满足,则会自动进入默认值default里进行打印

例子:打印星期,如果day的输入不是1-7的值,则输出“输入错误

int main()
{
 int day=0;
 scanf("%d",&day);
 switch (day)
 {
     case 1:
     case 2:
     case 3:
     case 4:
     case 5:
         printf("工作日");
         break;
     case 6:
     case 7:
         printf("休息日");
         break;
     default:
         printf("输入错误");
         break;
 }
 return 0;
}

注意:case语句与default语句是没有先后顺序的,不过为了方便理解,一般都会把default放在最后面

六. while循环

1.if和while的对比

语法结构与if的很相似

while(表达式)
     语句;

下面进行代码的对比:

1.if

int main ()
{
  if (1)
     printf("hehe\n");
 return 0;
}

这个代码的意思是:如果if后面的条件满足,结果只打印一次hehe

2.while

int main()
{
 while (1)
      printf("hehe");
 return 0;
}

这个代码会进入死循环,一直打印hehe

2. while循环的实践

例子:在屏幕上打印1-10的值

int main()
{
 int a=1;//循环变量的初始化
 while (a<=10)//括号里的内容其实是在判断,如果只是一个数字,则判断它是否为0,因为为0则为假
 {
   printf("%d",a);
   a=a+1;//调整
 }
 return 0;   
}

练习:输入一个整数,逆序打印这个整数的每一位

int main()
{
  int a=0;
  sacnf("%d",&a);
  while(a)
      {
      printf("%d",a%10);//获取输入数的最小值
      a=a/10;//去掉输入数的最低位
      }
return 0;
}

此处的a如果运行到0时,则自动停止,因为0在c语言中表示假

七. for循环

1.语法形式

for 循环其实是三种循环里用的最多的,语法形式如下:

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

表达式1:用于循环变量的初始化(初始化的数字是先直接进行语句的运行,不需要先被调整)

表达式2:用于循环变量结束条件的判断

表达式3:用于循环变量的调整

2. for循环的实践

例子:在屏幕上打印1-10的所有值

int main()
{
 int a=0;
 for(a=1; a<=10; a++)
 printf("%d",a);
 return 0;
}

练习:计算1-100之间3的倍数的数字之和

int main()
{
 int a=0;
 int sum=0;
 scanf("%d",&a);
 for (a=1; a<=100; a++)
 {
  if (a%3==0)
      sum+=1;
 }
 printf("数字之和是",sum);
 return 0;
}

八. do-while循环

1.语法结构

do-while语句是三大循环结构中最少用的,语法形式如下:

do
     语句;
while(表达式);

表达式的作用是判断

do while 语句与for和while最大的区别是:前者是先执行,后判断。而后两者是先判断,后执行循环语句

2. do while循环的实例

例子:在屏幕上打印1-10的值

int main()
{
 int a=1;
 do
 {
   printf("%d",a)
   i=i+1
 }while(i<=10)
 return 0;
}

练习:输入一个正整数,计算这个整数是几位数

int main()
{
 int a=0;
 int b=0;
 scanf("%d",&a);
 do
 {
   b=b+1;
   a=a/10;
 }while (a)
   printf("%d\n",b);
 return 0;
}

在这段代码中,b就相当于统计循环了多少次,同时在此题中,循环的次数代表着输入的整数是几位数

九. break和continue语句

break的作用是永久的终止循环,只要有break出现,就会立即跳出循环

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

十. goto语句

goto语句可以实现在同一个函数内跳转到设置好的标点符号处

例子:

int main()
{
 printf("hehe\n");
 goto next;
 printf("haha\n");
next:
 printf("hihi\n");
 return 0;
}

这串代码的意思就是跳过了haha,只打印hehe和hihi

另外goto语句可以从多个循环中直接跳出,这也是它的一个有点,例

for(...)
{
    for(...)
    {
           for(....)
           {
              语句
              goto next;
           }
    }
}
next:

在这里使用goto·语句可以是程序直接跳出多个循环,然而break却不能,因为它只能跳出一层for循环。

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值