一.C语言的结构分类与语句

C语言是一门结构化的程序设计语言

生活中的结构:

1.顺序结构

2.选择结构

3.循环结构


顺序结构是指从上往下执行,不进行任何的选择与循环

选择结构指有选择性的执行相关语句

循环结构指可能会一直执行某条语句进入循环,直到跳出循环


选择结构在C语言中体现出来的是if语句与switch语句

循环结构在C语言中体现出来的是while\for\do...while 这三类语句


什么是语句?

在C语言中由一个分号分开的就是一条语句,如以下代码

#include<stdio.h>
int main(void)
{
int a = 10;
return 0;
}

若将int a =10后面的分号去掉则是语法错误,编译器将无法进行编译,如图所示:

C语言分支与循环(1)---while语句_while循环

注意:只有一个分号也算是一条语句


二.if语句的语法结构

1.if(表达式1)
      语句1;

当if语句中表达式1为(真)非0值的时候,则执行语句1,如果为(假)0值的时候则什么都不执行

2.if(表达式1)
      语句1;
else
     语句2;

当if语句中表达式1为(真)非0值的时候,则执行语句1,如果为(假)0值的时候则执行else中的语句2

3.if(表达式1)
      语句1;
else if(表达式2)
      语句2;
else
      语句3;

当if语句中表达式1为(真)非0值的时候,则执行语句1,如果为(假)0值的时候则判断else if语句中的表达式2的值,若表达式2为(真)非0值的时候则执行语句2,若为(假)0值的时候则执行else语句中的语句3


我们先来看一下第一种情况:

#include<stdio.h>
int main(void)
{
int age = 10;
if(age<18)
printf("未成年!\n");
return 0;
}

因为 10<18 所以这时候编译器会输出未成年,我们如果将变量age的值改为20,则什么都不会输出

接下来是第二种情况:

#include<stdio.h>
int main(void)
{
int age = 20;
if(age<18)
printf("未成年!\n");
else
printf("成年!\n");
return 0;
}

因为 20>18 所以这时候编译器会输出成年,我们如果将age的值改为10,则 10<18 满足if的条件,所以会输出未成年

我们再来看一下最后一种情况

#include<stdio.h>
int main(void)
{
int score = 95;
if(score<60)
printf("不及格!\n");
else if(score>=60 && score<=74)
printf("及格!\n");
else if(score>=75 && score<85)
printf("良好!\n");
else if(score>=85 && score<=99)
printf("优秀!\n");
else 
printf("满分!\n");
getchar();
return 0;
}

当score的值小于60的时候则会输出不及格,当score的值大于等于60且小于等于74的时候则会输出及格,当score的值大于等于75且小于85的时候会输出良好,当score的值大于等于85且小于等于99的时候则会输出优秀,当所有条件都不满足时则输出满分,如图所示:

C语言分支与循环(1)---while语句_#include_02

注意:当表达式需要表示多个条件时,每一个条件用 && 隔开

注意:在C语言中一切非0的数表示真,0表示假

2.如果if语句中表达式条件成立,需要执行多行语句则需要使用{},这就是代码块,如以下代码:

if(表达式1)
{
语句列表1;
}
else
{
语句列表2;
}

示例:

C语言分支与循环(1)---while语句_if语句_03


3.悬空else,如以下代码:

#include<stdio.h>
int main(void)
{
int a = 0;
int b = 2;
if(a==1)
if(b==2)
printf("厉害!\n");
else
printf("太厉害了!\n");
return 0;
}

以上代码执行的结果是什么都不会输出,为了方便讲解,我们把代码放在VS中观察:

C语言分支与循环(1)---while语句_#include_04

我们可以发现a不等于1,所以为假,则不执行if的相关语句,此时else与if(b2)是一堆,为if else语句,既然if(a1)都为假了,那么if(b==2)中的语句将不会被执行,如果if语句都没有被执行,else语句也同样不会被执行,所以输出的是空

由此得出结论:else语句是和最近的if语句相匹配的


4.代码可读性以及=与==的区别,我们猜一下以下代码编译运行后会输出什么结果:

#include<stdio.h>
int main(void)
{
int num = 3;
if(num=5)
{
printf("Hello");
}
getchar();
return 0;
}

这段代码输出结果是Hello,可能有的人就不理解了,明明num=3,3不等于5,怎么还会输出Hello呢?

原因是一个 = 代表的是赋值,也就是将5赋给num,这时候num=5,满足表达式条件,所以会输出Hello,而需要判断两个数字是否相等需要使用 == ,当我们使用 == 时由于num的值为3不等于5,所以不会输出任何东西,如图所示:

C语言分支与循环(1)---while语句_#include_05

所以为了避免这样的错误,我们需要加强代码的可读性,以及限制自己出错的机会,如以下代码可以很好的避免 = 与 == 混淆

#include<stdio.h>
int main(void)
{
	int num = 3;
	if (5==num){
  printf("Hello");
	}
	getchar();
	return 0;
}

我们将num与5的位置换了一下,使得常量5在的左侧,变量num在的右侧,如果这时候我们不小心漏掉了一个=,这时候编译器将报错,因为代码将变成 5=num 也就是将变量的值赋给常量,这样的代码风格可以很好的避免这种情况的发生,如图:

C语言分支与循环(1)---while语句_while循环_06

C语言分支与循环(1)---while语句_if语句_07


题目:判断并输出1-100中的奇数

方法一:

#include<stdio.h>
int main(void)
{
int i = 0;
while(i<100)
{
int x = i % 2;
if(x==1)
{
printf("%d ",i);
}
i++;
}
getchar();
return 0;
}

首先声明变量i并为其赋值,使i=0,然后创建while循环语句,当i<100的时候则进入循环,声明变量x,x的值为i % 2 的值,我们都直到一个数除以2如果余1则这个数为奇数,如果余0则为偶数,使用if语句判断x的值是否等于1,如果等于1则调用printf函数进行打印,最后让i进行自增,这样就可以输出1-100中的奇数了

方法二:

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

首先声明了变量i并为其赋值,使i=1,然后创建while循环语句,当i<=100的时候进入循环,调用printf()函数输出i的值,随后让i+2,一个奇数加上2,则结果还是等于奇数,利用这个原理我们可以循环输出i的值,最后一样可以输出1-100中所有的奇数

                                                                                                             2023/7/18

                                                                                                                 王起舟