传送门:C语言-第一章:基本认识
目录
第一节:变量
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; // 代码的出口
}
它的执行结果:
我们成功打印出了“Hello world!”,下面的内容属于默认打印的信息,暂时忽略。上述代码中的printf后面的括号中的数据表示我们给它的参数,那么我们要怎么打印变量里的内容呢?printf是可以接受多个参数的:
#include <stdio.h> // 包含printf函数的文件,暂时不解释
int main() // main函数,代码的入口
{
int a = 10; // 变量a的定义与初始化
printf("Hello world! %d",a); // printf函数
return 0; // 代码的出口
}
上述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;
}
于是我们可以利用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;
}
因为a的值为1,而1一定大于0,所以条件表达式为真,就会执行printf函数打印内容,我们再来看看条件表达式为假的情况:
#include <stdio.h>
int main()
{
int a = 1;
if (a > 10) // 条件表达式为假,跳过这个if
{
printf("条件表达式为真");
}
return 0; // 跳到我这里执行我
}
因为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;
}
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;
}
可以看到,第一个条件表达式为真,第二个条件表达式也为真,但是它只执行了第一个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;
}
因为分支语句是不走回头路的,所以当任意一个条件表达式为真时,else 语句就不会执行了:
#include <stdio.h>
int main()
{
int a = 1;
if (a < 0) // 为假
{
printf("第一个条件表达式为真");
}
else if (a == 1) // 为真
{
printf("第二个条件表达式为真");
}
else
{
printf("条件表达式都为假,执行我");
}
return 0;
}
因为 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;
}
按道理来说,因为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;
}
当代码运行到任何一个 break 时,就会跳出switch,这样就将所有 case 分割开了。
2-3.循环语句
循环语句可以重复使用代码,帮助我们完成一些重复的工作
2-3-1.while 语句
while 语句是一种简单又常用的循环语句,它的用法如下:
while(条件表达式)
{
条件表达式为真就执行我,我是一条或者多条语句,我被称为 循环体
}
它的执行逻辑是:
如下是一个具体用例:
#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;
}
ps:“\n”表示换行符,也就是回车,可以让下一次打印的数据另起一行,让打印结果更清晰明了
最终当 a 的值为5时,a < 5这个条件表达式为假,就跳出while循环了。
2-3-2.for 语句
for 语句相对 while 语句复杂一点点,也是常用的循环语句,它的用法如下:
for(初始化;条件表达式;增量/减量)
{
循环体
}
它的执行逻辑是:
它的具体用例如下:
#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;
}
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(条件表达式);
它的执行逻辑如下:
它会先执行一次循环体,然后再判断循环条件是否满足,使用 do while 循环时,循环体一定会被执行一次,无论此时条件表达式是否为真。
它的具体用例忽略,可以自己参照 while 语句试着写一下代码
下期预告:
下一次是加餐,将介绍以下内容:
1.使用分支语句写一个简单的猜数字小游戏
2.循环嵌套以及使用循环嵌套打印九九乘法表
更新时间为2024年8月6日18:00前