C语言-第二章:变量与逻辑控制语句

传送门:C语言-第一章:基本认识

目录

第一节:变量

        1-1.什么是变量

        1-2.如何创造变量

        1-3.变量的使用

                1-3-1.变量的赋值

                1-3-2.printf函数

第二节:逻辑控制语句

        2-1.顺序语句

        2-2.分支语句

                2-2-1.if 语句

        2-2-2.else if 语句

                2-2-3.else 语句

                2-2-4.switch 语句

        2-3.循环语句

                2-3-1.while 语句

                2-3-2.for 语句

                2-4.do while 语句

下期预告:


第一节:变量

        1-1.什么是变量

                上一章的第四节介绍了C语言的基本类型,我们提到可以用基本类型创造“盒子”来存放数据,这个“盒子”就是变量。我们在变量中存放各种各样的数据(比如整数、小数、字符等)供我们使用。

        1-2.如何创造变量

                除了用到基本类型外,还需要遵循C语言的语法格式:

[基本类型] [变量名称]; 

                例如,我要创造一个整型类型(int)的变量:

int a;

                上述代码就是利用整型类型这个“模具”,创造了一个名为“a”的整型变量。其他类型如下:

long b;       // 长整型
short c;      // 短整型
char d;       // 字符型
float e;      // 浮点型
double f;     // 双浮点型

                我们把上述过程中,用类型创造变量的过程称为 定义,然后在口头表达和书面表达上,类型名称习惯用英文缩写,即:定义了一个int类型的变量a;定义了一个long类型的变量b;定义了一个short类型的变量c......

        1-3.变量的使用

                1-3-1.变量的赋值

        变量定义好后,我们需要在里面放数据,这种过程叫做变量的赋值。我们利用“=”来完成赋值,请看如下代码:

int a;   // 变量的定义
a = 10; // 变量的赋值

        不仅如此,我们还可以用已经赋值好的变量用来赋值其他变量:

int a;
a = 10;  // 设置好一个变量

int b;
b = a    // 用a赋值b

        ps:不同于数学上的“=”,C语言中的“=”表示:把“=”右边的值复制到“=”左边的变量中。

        实际上,变量的定义和赋值可以在一条语句中完成:

int a = 10;

        这种在变量定义之初就赋值方式叫做 初始化。

        那么我们如何证明变量确实被赋值了呢?接下来容我隆重介绍一个函数:printf

                1-3-2.printf函数

        C语言的函数和数学上的函数相似:我们给它传入参数,它给我们想要的结果。现在可以将函数简单的理解为工具,我们给它需要的参数后,它去执行一些功能,然后给我们完成一些工作。而printf函数的功能就是 向屏幕打印数据。这里的打印不是真的像打印纸张那样打印出实体,而是在屏幕上显示。

        我们先见一下简单的printf函数使用:

#include <stdio.h>            // 包含printf函数的文件,暂时不解释
int main()                    // main函数,代码的入口
{
    printf("Hello world!");   // printf函数
    return 0;                 // 代码的出口
}

        它的执行结果:

42d68a6e2a594005bfff74e0c1c9b2d4.png

        我们成功打印出了“Hello world!”,下面的内容属于默认打印的信息,暂时忽略。上述代码中的printf后面的括号中的数据表示我们给它的参数,那么我们要怎么打印变量里的内容呢?printf是可以接受多个参数的:

#include <stdio.h>                 // 包含printf函数的文件,暂时不解释
int main()                         // main函数,代码的入口
{
    int a = 10;                    // 变量a的定义与初始化
    printf("Hello world! %d",a);   // printf函数
    return 0;                      // 代码的出口
}

                                

95a93a7e70494cff9a8fecadd93b0ef2.png

        上述printf中,我们发现变量a的值代替了“%d”,这是因为printf会识别到前面内容的“%d”,然后用后面的变量a的值去代替。不同类型的变量的代替文本是不同的:

int -> %d

long -> %ld

short -> %hd

char -> %c

float ->%f

double ->%lf

        而且它们可以同时传入同一个printf,然后按顺序依次替换:

#include <stdio.h>
int main()
{
    int a = 10;                     // %d
    char b = 'A';                   // %c  字符需要用单引号,这是C语言的规定
    float c = 1.111111;             // %f
    printf("%d %c %f", a, b, c);  
    return 0;
}

08e48169253c4ea6aed26e543481e9fa.png

        于是我们可以利用printf函数验证1-3-1中的变量的值了,这里不再做演示。

第二节:逻辑控制语句

        2-1.顺序语句

        这是C语言的默认语句,C语言的默认执行顺序就是从上到下:

int main()
{
    我是第一条语句,先执行我;
    我是第二条语句,然后执行我;
    我是第三条语句,最后执行我;
}

        2-2.分支语句

        分支语句可以让代码的执行跳过一条或多条语句,只执行需要执行的语句。

                2-2-1.if 语句

        if语句是分支语句的一种使用方法,并且所有的分支语句必须以 if 语句开头(switch 语句除外),我们看它如何使用:


    if(条件表达式)
    {
        如果条件表达式为真就执行我,我是一条或者多条语句
    }

        我们来看看它的具体用法:

#include <stdio.h>
int main()
{
    int a = 1;
    if(a>0)
    {
        printf("条件表达式为真");
    }
    return 0;
}

4060e22f0b4246fb90b78f99762251fb.png

        因为a的值为1,而1一定大于0,所以条件表达式为真,就会执行printf函数打印内容,我们再来看看条件表达式为假的情况:

#include <stdio.h>
int main()
{
    int a = 1;
    if (a > 10)                // 条件表达式为假,跳过这个if
    {
        printf("条件表达式为真");
    }
    return 0;                  // 跳到我这里执行我
}

26ebeac91aa74eaaaf0cd09fc6f73fba.png

        因为a的值为1,而1一定小于10,所以条件表达式为假,就不会执行printf函数打印内容。

        2-2-2.else if 语句

        else if 语句要配合 if 语句使用,且使用方法与 if 语句类似,我们直接看它的具体使用:

#include <stdio.h>
int main()
{
    int a = 1;
    if(a>10)
    {
        printf("第一个条件表达式为真");
    }
    else if(a==1)
    {
        printf("第二个条件表达式为真");
    }
    return 0;
}

37f63a98252a428b9b2bbb9d8f5eea09.png

        ps:这里的“==”表示判断相等,左右两边相等为真,不相等为假。

        上述代码的执行逻辑是:先判断第一个条件表达式,为假,然后判断第二个条件表达式,为真,就执行第二个printf函数。只要上一个条件表达式被被判断为假就判断下一个条件表达式

        else if 语句是可以无限续接的,可以创造多个分支:

#include <stdio.h>
int main()
{
    int a = 1;
    if(a>10)
    {
        printf("第一个条件表达式为真");
    }
    else if(a==1)        // 第一个else if
    {
        printf("第二个条件表达式为真");
    }
    else if(a<0)         // 第二个else if,后面还可以接很多个else if,以此类推
    {
        printf("第三个条件表达式为真");
    }
    return 0;
}

        值得注意的是,if 语句 和 else if 语句最多只能进入一个分支,即不走回头路:

#include <stdio.h>
int main()
{
    int a = 1;
    if (a > 0)         // 为真
    {
        printf("第一个条件表达式为真");
    }
    else if (a == 1)   // 为真
    {
        printf("第二个条件表达式为真");
    }
    else if (a < 0)
    {
        printf("第三个条件表达式为真");
    }
    return 0;
}

f667656c8cc44d829821199c3b2d9eed.png

        可以看到,第一个条件表达式为真,第二个条件表达式也为真,但是它只执行了第一个printf函数,这是因为只要进入了上面的某一个分支,下面的所有分支就不会在判断条件表达式,更不会执行了,即不走回头路。

                2-2-3.else 语句

        else 语句是一种“保险措施”,当所有分支的条件表达式都为假时,它才会执行:

#include <stdio.h>
int main()
{
    int a = 1;
    if (a < 0)          // 为假
    {
        printf("第一个条件表达式为真");
    }
    else if (a == 2)    // 为假
    {
        printf("第二个条件表达式为真");
    }
    else
    {
        printf("条件表达式都为假,执行我");
    }
    return 0;
}

66bbfb7a79b84c48bc82311e4671f488.png

        因为分支语句是不走回头路的,所以当任意一个条件表达式为真时,else 语句就不会执行了:

#include <stdio.h>
int main()
{
    int a = 1;
    if (a < 0)          // 为假
    {
        printf("第一个条件表达式为真");
    }
    else if (a == 1)    // 为真
    {
        printf("第二个条件表达式为真");
    }
    else
    {
        printf("条件表达式都为假,执行我");
    }
    return 0;
}

c67a0b9eddae4e0a9fa0d7d4a10ca8e1.png

        因为 else 语句之上的条件表达式要么为有真,要么为全假,所以带有 else 的分支语句必定会执行其中一条分支(不是else 分支就是其他分支)。

        当出现多个 if 语句时,else与在它上面的、离它最近的 if 语句匹配,书写代码时要杜绝模棱两可的 else 悬挂问题:

#include <stdio.h>
int main()
{
    int a = 1;
    int b = 0;
    if (b > 1)
    {
        printf("b > 1");
    }
        if (a < 0)
        {
            printf("a < 0");
        }
    else                // 悬挂else
    {
        printf("条件表达式都为假,执行我");
    }
    return 0;
}

        上述代码的 else  语句到底与哪个 if 语句匹配呢?这里看起来很像与第一个 if 语句匹配,但是根据上面的说法,它实际上与第二个 if 语句匹配,这种格式降低了代码的可读性,所以要将匹配的语句对齐:

#include <stdio.h>
int main()
{
    int a = 1;
    int b = 0;
    if (b > 1)
    {
        printf("b > 1");
    }

    if (a < 0)
    {
        printf("a < 0");
    }
    else             
    {
        printf("条件表达式都为假,执行我");
    }
    return 0;
}

        这样就清晰明了了。 

        还需要强调的是, else if 语句 和 else 语句都不能脱离 if 语句单独使用,即下列用法是错误的:

#include <stdio.h>
int main()
{
    int a = 1;
 
    else if (a == 1)    // 错误用法
    {
        printf("第一个条件表达式为真");
    }
    //-------------------------------------------------------

    else                // 错误用法
    {
        printf("条件表达式都为假,执行我");
    }
    return 0;
}

                2-2-4.switch 语句

        switch 语句也是分支语句,但在某些场景下使用比上述分支语句更高效,下面我们来看看它的使用方法:

switch (表达式 或者 变量)
{
	case value1:
		表达式或者变量等于 value1 就从我开始执行,我是一条或者多条语句
	case value2:
		表达式或者变量等于 value2 就从我开始执行,我是一条或者多条语句
	case value3:
		表达式或者变量等于 value3 就从我开始执行,我是一条或者多条语句
	default:
		表达式或者变量不等于上述任何一个 value 就从我开始执行,我是一条或者多条语句
}

        下面是一个具体案例:

#include <stdio.h>
int main()
{
	int a = 0;
	switch(a)
	{
		case 0:
			printf("a = 0 ");
		case 1:
			printf("a = 1 ");
		case 2:
			printf("a = 2 ");
		default:
			printf("默认情况:a不等于任何一个value");
	}
    return 0;
}

c539f73b3c6940c79447edd9da794524.png

        按道理来说,因为a的值为0,它的执行结果应该是“a = 0 ”,但是后面的语句也被执行了,这是因为代码会从等于 value 的case开始执行到结尾,而不是只执行等于 value 的case,所以它从case 0 按顺序执行到了 default。

        那么如何解决上述问题呢?我们需要用到一个关键字:break,break意味“打破”,我们利用它可以“打破” switch,直接跳到外面:

#include <stdio.h>
int main()
{
	int a = 0;
	switch (a)
	{
		case 0:
			printf("a = 0 ");
			break;
		case 1:
			printf("a = 1 ");
			break;
		case 2:
			printf("a = 2 ");
			break;
		default:
			printf("默认情况:a不等于任何一个value");
	}
    return 0;
}

2405e5c1e54a4367ac842fa2212264ac.png

        当代码运行到任何一个 break 时,就会跳出switch,这样就将所有 case 分割开了。

        2-3.循环语句

        循环语句可以重复使用代码,帮助我们完成一些重复的工作

                2-3-1.while 语句

        while 语句是一种简单又常用的循环语句,它的用法如下:

while(条件表达式)
{
    条件表达式为真就执行我,我是一条或者多条语句,我被称为 循环体
}

        它的执行逻辑是:

e722524e4f1e43879011ca620924092a.png

        如下是一个具体用例:

#include <stdio.h>
int main()
{
	int a = 0;
	while (a < 5)
	{
		a = a+1;   // a+1是一个表达式,它会用目前a的值先计算a+1的值,然后把这个值复制给a
		printf("此时a = %d\n", a);
	}
	printf("最终a = %d", a);
	return 0;
}

99b13428cf4e4485ad84ecb6ae81ee5d.png

        ps:“\n”表示换行符,也就是回车,可以让下一次打印的数据另起一行,让打印结果更清晰明了

        最终当 a 的值为5时,a < 5这个条件表达式为假,就跳出while循环了。

                2-3-2.for 语句

        for 语句相对 while 语句复杂一点点,也是常用的循环语句,它的用法如下:

for(初始化;条件表达式;增量/减量)
{    
    循环体
}

        它的执行逻辑是:

384ccf8d4ebc4dba8e8f1ab352b79571.png

        它的具体用例如下:

#include <stdio.h>
int main()
{	
	int a = 0;
	for(a = 0;a < 5;a++)
	{
		printf("此时a = %d\n", a);
	}
	printf("最终a = %d", a);
	return 0;
}

6f93127795b84bc2a488b52dd1483f96.png

        ps:这里的“a++”表示a先赋值(如果有“=”),然后a自增1,这里的“a++”也可用“a=a+1”代替。

        上述代码中,a 从0开始,每次循环都增加1,直到 a 为5时,条件表达式 a < 5为假,此时跳出循环。

                2-4.do while 语句

        do while 语句与 while 语句相似,也有他自己的使用场景,但是用得比较少,它的用法如下:

do
{
    循环体
}while(条件表达式);

        它的执行逻辑如下:

43d76c06bae144aa8ff6c92eeef01d91.png

        它会先执行一次循环体,然后再判断循环条件是否满足,使用 do while 循环时,循环体一定会被执行一次,无论此时条件表达式是否为真。

        它的具体用例忽略,可以自己参照 while 语句试着写一下代码

下期预告:

        下一次是加餐,将介绍以下内容:

                1.使用分支语句写一个简单的猜数字小游戏

                2.循环嵌套以及使用循环嵌套打印九九乘法表

                更新时间为2024年8月6日18:00前

传送门:C语言-第二章-加餐:猜数字游戏与循环嵌套

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值