白泽的C语言入门(三) 如果,直到,循环

众所周知,小红书使用的编程标准已经太老太老了,很容易在1202年的编译软件/在线网站上生发一些奇奇怪怪的错误。于是乎为了让大伙不要在C语言/程序设计基础课上被谭浩强带出高血压来,白泽决定借着以前带少儿编程班的经验,给大伙写一部同龄人能看的程序设计入门教程~

笔墨愚钝,不知所言,乞谅。

注:本系列所有文本除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请联系作者、注明出处!

——爱你们的白泽

零.关于逻辑运算,你需要知道的事儿

补充讲一下之前有关运算符的没讲明白的地方

1.关于加减乘除以及各种数学运算

在上一课时中,我们讲到了C语言中的五则运算:

1
2
3
4
5
6
7
int a,b,c;
scanf("%d %d",&a,&b);
c=a+b;//加法运算
c=a-b;//减法运算
c=a*b;//乘法运算
c=a/b;//除法运算
c=a%b;//模运算,使c的值变为a/b的余数,读作a模b

这里主要补充一下有关除法运算与模运算的一些细节

对于除法运算,如果是两个整型变量a和b相除,最后的值不会四舍五入掉小数部分,而是直接将算出来的数的小数部分直接抹去,即向下取整。利用这个性质,我们可以直接除去一个数右边的几个数位,就像这样:

1
2
int a=12345;
a=a/10;//除去a的最后一位数,现在a的值变为了1234

除法运算我们先说到这里,我们再来讲讲模运算。简单的来说,我们可以把一次a%b当成是进行了一次a和b之间的除法运算,然后取运算后得到的余数。对于这个过程,我们需要明确的是,对于一次模运算而言,其结果与与两数之商没有关系;但是与除法相同,在a%b中b也不能为0。当然,好学的你肯定会问——对于a与b中出现了负数的情况,我们应该怎样确定模运算结果的符号呢?事实上,在整个大一的学习生活中,你都不会碰到这样的情况,因此这里不做讲解(毕竟打字很累,对吧?)

类比除法运算,因为得到的值是余数,其实我们很容易想到,我们可以利用模运算除去一个数左边的几个数位,就像这样:

1
2
int a=12345;
a=a%10000;//除去a的第一位数,现在a的值变为了2345

2.大于小于,逻辑运算

很多时候,我们在义务教育中学到的数学和计算机中的数学都有一样的规则,不过在逻辑运算这一块儿是个例外。

不过我不是在说义务教育内容不好(虽然确实如此但是我没说出来),而是说,计算机有自己的一套规则。

让我们从**>、<、==讲起吧。对于a>b,我们在计算机中,不会将其当成规定a的值大于b,而是将其作为一个值,而这个值取决于计算机的判断——a是否比b大。如果a确实比b大,也就是a>b成立,那么a>b这个式子的值就为1,否则其值为0。小于、等于、不等于也同理。**

我们很早很早就在某一堂数学课上学到,大于小于符号是具有传递性的,因此白泽常常看到大伙这么写道:

1
2
3
//判断a是否比b和c都大
int a=1,b=2,c=3;
int d=a>b>c;

这是错的!

虽然大于小于这些符号确实在数学上是有传递性的,但是由于计算机比较笨,他在判断a>b>c这个式子时是这样的:

从左到右,先判断a和b的大小;因为a=1而b=2,所以a>b的值为1;这时再判断a>b这个式子的值是否比c大,即判断(a>b)>c。因为a>b的值为1,因此实际上笨笨的电脑目前在判断:1>c。因为c的值为3,因此1>c是错的,于是这个式子的值是0,故整个式子a>b>c的结果为0

那么我们应该怎样使用这些符号的传递性呢?

1
2
3
4
//判断a是否比b和c都大
int a=1,b=2,c=3;
int d=a>b && b>c;//&&代表且,||代表或。
//a>b && b>c代表:a比b大而且b比c大

这一部分暂时结束~

3.或与且

接着刚刚讲的&&与||,我们继续补充一点相关内容。事实上,&&和||可以用作连接左右两边的值(或是式子,毕竟计算机会把一个式子最终的结果当成一个值,就像刚才的大于小于式),并按一定的规则给出最终的值,就像这样:

1
2
3
4
5
//这一部分内容很少,你只需要知道:
//&&也可以写作and,如果两边的值都大于0,则包含&&在内的整个大式子的值为1,否则为0
//举个例子:1 && 2999的值为1,0 && 1231298的值为0
//||也可以写作or,如果两边的值有任意一个大于0,则包含||在内的整个大式子的值为1,否则为0
//举个

补充完毕。

一.如果,if(我是DJ)你会爱我吗?

1.本体

if是一个逻辑块,因此它长得也很逻辑块:

1
2
3
if(){

}

我们在小括号中添加式子或值,在大括号内添加指令。对于一个if逻辑块而言,我们会进行一次判断——如果小括号内的值不为0,则执行一次大括号里的指令,否则跳过。

1
2
3
4
int a=1,b=2;	
if(a<b){
printf("Hello World!\n");
}

if的本体讲完了。没错,就是这么简单。值得注意的是,无论if内部的内容是否被执行,都不会跳过if外的所有内容。

1
2
3
4
5
6
7
if(a>b){
if(a>b+2){
if(a>b+3){
printf("这么写当然是合法的,只要你不嫌麻烦,想写几层就写几层~");
}
}
}

2.else,无限可能

很多时候,我们也会用到与if配套的else指令,其原理十分简单,我们借助一个例子来说明它的运作方式:

1
2
3
4
5
6
7
8
9
if(a>b){
printf("A>B");
}
else if(a<b){
printf("A<B");
}
else{
printf("A=B");
}

我们一步一步来分析这个代码~

这个连续的逻辑块是这样运行的:先判断a>b,若成立则输出A>B,否则再判断a<b,若成立则输出A<B,否则输出A=B。

是的,聪明如你肯定已经明白,else就是否则的意思

注:else只能用于if的大括号之后!!

二.while,多次循环

说完了if,我们自然会想到——如果我想重复执行一系列指令,直到满足某个特定条件,应该怎么办呢?

很简单嘛,我们用if来实现:

1
2
3
4
5
6
7
8
9
10
11
12
if(a<b){
printf("Hello World!");
a=a+1;}if(a<b){
printf("Hello World!");
a=a+1;}if(a<b){
printf("Hello World!");
a=a+1;}if(a<b){
printf("Hello World!");
a=a+1;}if(a<b){
printf("Hello World!");
a=a+1;
}... ...//这个省略号表示我们需要写很多很多个if,在你的程序里不能出现这个!!printf("End");

显然,这样会让我们代码的行数变得异常地长,因此C语言的发明人定义了另一个革命性的代码块——While

1
while(){    }

使用while时,如果小括号中的值不为0,那么计算机会一直重复while内的指令,直到小括号中的数变为非0为止。因此我们在之前写的大量if判断可以被替换成这样:

1
2
3
4
while(a<b){    
printf("Hello World!");
a=a+1;
}printf("End");

当然,如果你希望你的电脑一直输出Hello World直到电量耗尽,可以这样:

1
2
3
while(1){
printf("Hello World!");
}

讲完了。

三.更复杂的循环形式——for

与while相同,for循环也会一直执行大括号内的指令,直到满足一定的条件。不过它长这个样子:

1
2
for(;;){
}

小括号中的分号代表我们需要在其前边填上一些指令。你在小括号里添加的第一个指令只会被执行一次,第二个指令会被当成是一个值,循环会持续下去直到这个值变为一个正数,而第三个指令则会在每次循环结束后执行一次,就像这样:

1
2
3
4
int i;
for(i=0;i<10;i=i+1){
printf("Hello World");
}/*我们在最初会使得i的值变为0,然后大括号内的语句会一直重复执行,直到i<10不满足为止。同时,每次执行完大括号内的所有语句后,i的值都会变为i+1*/

当然,除了中间的那个空,其它的空都是不一定需要填写的:

1
2
3
for(;1;){
printf("Hello World");
}//这样你同样会得到一个一直输出Hello World的程序

那么今天的内容大概就是这些,中秋快乐=3=

补充

代码要多敲才能熟练,只看书不实操是没用的。与之相反的是,只实操不看书其实也能帮助你提升(点名批评某红色的书)

如果大伙需要练习题,欢迎找我,我题多的是=3=

结语

就像一位伟人说过的,不要害怕弄脏你的双手,去拿一些你想要拿到的东西。

当然疫情期间我还是建议大家不要摸不干净的东西,勤洗手,遵守防疫要求。