白泽的C语言入门(四) 一点点不一样的数学

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

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

——爱你们的白泽

零.你应该这么理解程序中的数学

就像白泽之前所说的,程序中的数学和你想的有那么一点点不一样。当然,我们也能找到其与我们学过的小学数学相似的地方。

在多年的义务教育中,我们了解过,对于任何一个式子,我们都能人为地判断这个式子是成立的或是不成立的。换句话说,我们可以说这个式子是对的或是错的。举个例子,1+2=5是错的,而1+2=3是对的;1>4是错的,5>4是对的。

在计算机里,我们会将对和错量化为0和1。因此,对于任何一个式子,我们都能说他的值是0或1。再举个例子,1+2=5的值应该为0,1+2=3的值为1;1>4的值为0,5>4的值为1。

因此实际上,计算机中的每个式子在本质上都是一个具体的数值,具体是0还是1取决于式子本身是否正确。

此外,对于各种运算,计算机都有一个人为规定的运算优先级,这也是你必须掌握的——一般而言,高优先级的运算会先进行,低优先级的运算会后进行,当优先级相同时,计算机遵照从左到右的顺序运算

好了,你应该已经理解了程序中的数学是什么样的了。让我们走进具体的运算里。

一.比四则要多一则的五则运算法则

我们在之前的课程中已经接触过了计算机的五种基本运算法则了——加、减、乘、除、模,但仅仅只是会用而已。因此,现在让我们走得更深入一些。

除位运算之外,五则运算是C语言里优先级最高的运算。而位运算我们现在不学,因此你可以认为五则运算就是C语言里优先级最高的运算了。

  • 加法与减法

    在五则运算中,加法与减法的优先级高于模运算,却低于乘除法。与你想的一样,我们可以用最简单的方式来表达加法与减法。

    1
    2
    3
    4
    a+b;
    a-2;
    1+2;
    //这些都不是式子,只是一次运算。换句话说,这么写不会改变a的值。

    当然,我们也能用加减法给一个变量赋值:

    1
    2
    3
    4
    int c=2+5;
    int d=c+2;
    c=c+1;
    1=2+1;//这是不行的:你不能给一个常数赋值。

    事实上,如果你只是想要让一个变量的值发生改变,那么代码还可以写得更简洁一点:

    1
    2
    a+=5;//等价于a=a+5。
    b-=5;//等价于b=b-5。

    如果你想让一个变量的值只改变1,那么代码还能再再简洁一点:

    1
    2
    3
    4
    5
    a++;//等价于a=a+1。
    b--;//等价于b=b-1。
    ++a;//等价于a=a+1。
    --b;//等价于b=b-1。
    ++++++++a;//等价于a=a+4。你当然可以这么写,但是我不建议你折磨自己。

    我们把最后这一种写法称作自增/自减。你肯定已经发现了,a++和++a两种写法都能让a的值增加1,那它们有什么不同呢?事实上,将符号写在变量的前面与后面,可以赋予这个运算一个优先级。举个例子吧:

    1
    2
    3
    4
    int a=1;
    printf("%d",a++);
    printf("%d",++a);
    //计算机会输出一个1,再输出一个3。

    在第一个printf中,计算机会先输出a的值,再使a的值加1;在第二个printf中,计算机会先使a的值加1,再输出a的值——将符号写在前面会让程序先进行自增自减运算,再进行其它运算;将符号写在后面会使得程序先进行其他运算,再进行自增自减运算。

  • 乘法与除法

    乘法与除法具有五则运算里最高的优先级,其用法也与加减法如出一辙:

    1
    2
    3
    4
    5
    6
    a*b;
    a/b;
    int c=2*5;
    int d=c/2;
    a*=4;
    b/=2;

    当然你不能用除法这么写:

    1
    2
    a**;//或许你可以把它理解为a=a*1,但是有什么意义呢?
    b//;//很遗憾,//已经作为注释符号了。
    • 特地讲一讲除法

      对于除法运算,如果这次运算的被除数和除数均为整数,那么其运算的结果也会是一个整数,这个整数应当是运算后商的整数部分。

  • 取模运算

    模运算是五则运算中优先级最低的一项。通常情况下,只有完成其它五则运算后,才会进行模运算。

    篇幅有限,加上大家的领悟能力无限,我想在这里我只用写一下取模运算的写法就可以了。

    1
    2
    3
    4
    a%b;
    int c=5%2;
    int d=c%3;
    c%=1;

    值得注意的是,取模运算只能由整数参与,不能也不会包含任何小数

注:+=、-=、*=、/=、%=的优先级与简单的五则运算不同,他们的优先级仅仅只高于或且非!(或且非后面会讲到)

那么我们就完成了五则运算的讲解。

二.大于小于等于,比较那个的运算

逻辑运算的优先级是低于五则运算的。

1
2
3
1>5;
42<c;
5!=2;

这一块儿只有两点需要讲:

  • 如果你想判断a是否和b相等,应该使用==而不是=,因为=是使右边的值被赋予给左边,==才是比较
  • 如果你想表达不等于,就使用!=,若左边和右边不相等时这个运算的值为1,否则为0

不过需要注意的是,在同时比较多个数的大小时,比如你想比较a、b、c三个数的大小,并返回一个值,你或许会这么写:

1
a>b>c

显然这是一种错误写法,而且好多好多来问我题的同学都犯过这样的错误。这里白泽统一讲一下原因:

我们可以带入三个数,令a=6,b=5,c=4,然后自己脑补出这个式子的运算过程:由于式子里所有运算符的优先级相同,因此计算机会从左往右地依次计算。先比较a和b的大小,即判断6>5,得出这个式子的值为1;然后再判断a>b这个式子的值与c之间的大小关系,即判断1>4,得出整个式子的结果为0。

我想这或许与你的逻辑有所不同。那么我们应该怎么按照自己的想法来判断多个数之间的大小关系呢?继续往下一章看叭~

三.或且非,相信你永远可靠的逻辑

接下来让我隆重介绍,怎样正确地表示三个数之间的关系:

1
a>b && b>c

这个式子的含义是:a>b而且b>c。相信你肯定已经明白——在今天介绍的几种运算符里,或且非是优先级最低的。

  • &&,且运算

    在C语言中,我们用&&表示且,对于两个值a和b,a && b的运算是这样的:当a和b都不为0时,整个式子的值为1,否则为0。这两种写法是等价的:

    1
    2
    a && b
    a and b
  • ||,或运算

    在C语言中,我们用||表示或,对于两个值a和b,a || b的运算是这样的:当a和b任意一个不为0时,整个式子的值为1,否则为0。这两种写法是等价的:

    1
    2
    a || b
    a or b
  • !,非预算

    我们用!表示对一个值取反。对于一个值a,若a为0,!a的值为1,否则为0。没错,你肯定已经理解了——!预算就是把当前运算的对错颠倒过来~

    1
    2
    3
    int a=1,b=2;
    int c=!(a==b);
    printf("%d",c);//这里程序会输出1

那么现在,你已经掌握了逻辑运算了。

四.结语

累死了,马上下课了,大家再见。

=3=