C基础四——逻辑才是一个程序的灵魂

前情提要

我们整理下你的技能树,到现在为止,你会了下面的技能吗。

  1. 独立敲打出一个程序的框架,熟悉c语言的基本语法(包含头文件,分号,大括号和括号)
  2. 知道什么是变量以及变量的类型,变量的表示和值范围
  3. 使用printf打印各种格式的信息
  4. 可以用scanf输入格式化的数据
  5. 使用简单的加减乘除
  6. 算法之间的优先级以及提高优先级的方法(使用括号)

如果你已经决定前情提要里面的东西so easy了,那么学习这一篇对你来说就是会比较容易的,如果前面的你还不够熟悉,也没有关系,反正你以后还会不断使用中熟悉他们,但是如果你现在还对这些一点概念都没有,那么不好意思,这篇对于你来说可能有点难,你最好先看看前面几篇再学习一下,不要觉得不好意思,一定要一步一个脚印扎扎实实的来,多动手,fighting!

从意外开始

上一篇,我在一个很小的地方留了个问题,不知道你有没有尝试过,在计算除法的时候使用1/0.实际上我们都知道1/0是不合法的,进行这样的计算是一定会出问题的,在计算机中我们虽然知道这些,但是当我们实现的软件很复杂的时候,你并不知道会有什么被输进去,如果输入任何数都进行类似a/b这样的算法,那么,当比人给b一个0的时候,程序就要出现问题了,如何避免这样的问题出现呢?这个时候,程序就需要逻辑去把控了,这个逻辑叫做,如果被除数为0,那么我们直接输出0,也就是人为创造了1/0等于0这样的规则,虽然说着在现实中仍然是不正确的,但是在我们的程序中却解决了问题,同时对于程序来说,这也能表达一定的含义。那么这个用c语言怎么实现呢?

if判断

我们在第二篇就讲了,if是一个关键词,是c标准实现的,我们不能修改它,它存在的意思就是这个有个判断,如果满足条件就运行指定的算法,当不满足的时候我们也可以运行其他代码,这个不满足,我们叫做else。
if的语法格式为if(表达式){}else{}
先看个简单的例子

#include<stdio.h>

int main()
{
    int a = 1;
    int b = 0;
    //printf("%d", a / b);
    if (b != 0)
    {
        printf("%d", a / b);
    }
    else
    {
        printf("%d", 0);
    }

    return 0;
}

关于if有几个点需要讲解的。

表达式

表达式说复杂了可以写好大一个篇幅,但实际其实没必要那么较真,就像数学公式一样,很多底层的道理很绕,但是实际使用中我们不知道用的多顺,表达式就是这样一个存在,初学不需要太花精力,用了自然有感觉,但是真要个定义,还真难说出来,所以这里就简单讲一下。

  1. 所谓的表达式,看起来就像公式一样,最后都会算出一个结果来,而这个结果都有两个属性:值和类型。
    简单理解就是这样的,我们在id中使用的就是表达式的这个特性,不管括号里面写多少东西,他最后算出来肯定是只有一个值,而这个值我们要把他转化成bool类型,bool只有两个值,真true,假false,实际上c语言中没有这个类型,c的关键字也没有这个字,一般我们会把不等于0(小于0也是true)的值叫true也就是是真的,等于0 的叫false。
  2. 从语法上讲,表达式一定不能以分号结尾。
    因为一旦加了分号,这就是个完成的语句了,也就是说,完整的句子一定不是表达式,这也是为什么你永远不会在if的括号里面看到分号
  3. 表达式除了了算出最后的值,往还有做其他的事,视表达式的复杂程度定
    下面举几个特殊例子(普通的就算了-_-)
    逗号表达式:表达式可以不只是一个公式,我们可以这样写,a+b,c+d,ef,都是可以的。
    逗号表达式的值是最后一个表达式的值,也就是说上面虽然写了那么长,最后我们用到的最后结果是e
    f,那前面写这么多干嘛呢,脑壳壳有问题?不是的,这就是我们上面说的干其他的事,在有些情况下,这些计算是有意义的,指不定什么时候就会用到了,我不知道你什么时候会用的上,但是我能给你一个例子,至少知道这前面的公式有时候是有意义的。比如:a=0,a+4.这里前面的公式的意义在于不管你之前是啥,我都把你变成0再进行计算,这个在程序术语里面叫做归零,是很常用的操作。
    等号表达式:有一个表达式a=3,它表示啥意思呢?这个公式最后的结果是3,可能你觉得很显而易见,但是我们要知道在程序中却并不是这么简单,这里a=3和单独的公式只有一个3区别是很大的,这里首先要给a一个3的值,最后我们使用的却是a,这里初步接触不过多深究,但一定要记住这样的用法,很多时候,一些代码会这样写减少代码量,但是更多的时候,并不是因为它使用性有多好,主要是,比较绕,别人喜欢考。其实程序发展到现在,除了c语言,已经很少有人用些很难懂的奇淫巧技了,代码都是以好懂为标准,但是毕竟这也算是一个技巧吧,偶尔在c中,还是见到有人用,能看懂当然还是很有必要的。

运算符

我们这里讲if的语法,要讲的表达式实际特指逻辑表达式,是一类可以判断真假的表达式,上面我们也讲了所谓的可以判断真假,其实就是可以判断计算的结果是不是0.除了常规的一些数值计算出来的值,我们用的更多的,其实是通过逻辑运算符算出来的值。
逻辑运算法

运算符 含义
> 当左边大于右边时为真
< 当左边小于右边的时候为真
== 只有两边相等的时候为真
>= 左边大于或者等于右边时为真
<= 左边小于或者等于右边时为真
!= 左边不等于右边的时候为真
! 取反,用在真值前面变成假,用在假值前面就变成真
&& 与 ,只有两边的表达式都是真的时候为真
|| 或,两边只有有一个为真结果就为真

同样,这些算法也有优先级关系,从上到下,优先级依次变低,同一行的优先级相同

> < >= <=
== !=
&&
||

知道了表达式和逻辑运算符,才算是可以正式使用if了,上面就已经给了一个简单的例子,我们用下面的代码处理了b等于0做除法的异常。

 if (b != 0)
 {
     printf("%d", a / b);
 }
 else
 {
     printf("%d", 0);
 }

可以看到第一句就是我们上面讲的if(表达式)部分,这个部分里面的表达式如果是真,会执行紧接着的一个语句或者代码块,这里虽然只有一个语句需要执行,我也使用了大括号将这句话括起来形成一个代码块,这样做一个是代码整洁,另一个也不容易出错。你完全可以不使用大括号这样写.虽然说这样写没有错,但是这种做法我不太推荐。

 if (b != 0)
     printf("%d", a / b);
 else
     printf("%d", 0);

然后你看到我们还写了给else,这个else英文意思是剩下的意思,在这里意思也是差不多的,就是说如果不对了,我也要执行一个操作怎么办,就在else里面做就可以了。这个else是不一定需要的,也就是有点时候你想说我只在正确的时候处理些事情,那么必要写这么多。就像下面这样

 if (b != 0)
 {
 	printf("%d", a / b);
 }

更多的if

else if嵌套

当我们 的分支比较多的时候怎么办嗯,比如我们平参与一些活动,一等奖是什么,二等奖是什么,然后三等奖是什么,这么多判断的时候要怎么办。我们除了可以分开一个个判断是不是一等奖或者二等奖还是三等奖,还能用else if 扩展选择,像下面这样。这里补充一点,命名规则本身没有要求变量命名要易读,但是往往写代码以后人都还要读的,比如我现在写的,以后就会给你们读,特别是很大的项目,往往代码经手很多人,所以变量命名一定要有含义,否则,很难懂的话,即使功能很好也是垃圾代码,因为没有办法维护。从这里开始,我们的代码中的变量基本都会使用有意义的名字,除了一些特殊情况。

int reward = 1;
if (reward == 1)
{
    printf("恭喜你中了一等奖\n");
}
else if(reward == 2)
{
    printf("恭喜你中了二等奖\n");
}
else if(reward == 3)
{
    printf("恭喜你中了三等奖\n");
}
else
{
    printf("其他奖\n");
}

也就是说,我们可以使用else if,来说,如果不是一等奖的话,是不是二等奖啊,这样一直扩展,后面的if里面的表达式为真,那么我们就找到了我们要的处理语句。如果选项很多,我们可以在特殊处理几项之后,使用else,包括剩下所有选项。同样的,你也可以不需要最后这个else,那表示剩下的你都打算不做任何处理。

if if

上面的情况是对一个变量的多个值判断,更复杂点,多个值判断呢。比如学校里面有老师和学生,都可以分男女,那对每一类处理不一样的话怎么办,这里我们就可以在if里面再加一个if做判断。如下:

int IsStudent = 1;
int IsBoy = 1;

if (IsStudent)
{
    if (IsBoy)
    {
        printf("男学生\n");
    }
    else
    {
        printf("女学生\n");
    }
}
else
{
    if (IsBoy)
    {
        printf("男老师\n");
    }
    else
    {
        printf("女老师\n");
    }
}

这个其实上面也讲过,就是if下面执行的是可以是一整个代码块的,自然也是可以还是一个if的语句的,这里我使用了大括号和缩进让代码很好识别,但是你试试看把大括号和缩进去了读一读,是不是看着特别绕,这么多的if和else,是个什么规则,c标准是这样说的,else会和自己最近的if配对,也就是从else往上找第一个。这里再次提倡if下面的代码即使只有一句,都最好使用大括号括起来。

note

  1. 表达式
  2. 逻辑运算符以及优先级
  3. 代码规范,变量要有意义
  4. if的语法
  5. 代码规范,使用大括号包括if执行的语句

附录

运算符优先级

* / %
+ -
> < >= <=
== !=
&&
||

猜你喜欢

转载自blog.csdn.net/u012505629/article/details/109579274
今日推荐