【从零开始的 C 语言笔记】第四篇-基本的运算子介绍 & 应用

不怎麽重要的前言

上一篇我们大概的介绍程序的结构,也出了一个小作业,不晓得大家有没有试试看呢?

其实写程序真的没有想像中那麽困难的,就像学英文一样好好的学习、理解文法,就可以很好上手了,希望大家不要害怕来跟着一步一步学习吧!


上次的小作业--列印三角形

方法一、

#include <stdio.h>

int main(){
    printf("*\n");
    printf("**\n");
    printf("***\n");
    printf("****\n");
    printf("*****\n");

    return 0;
}

方法二、

#include <stdio.h>

int main(){
    printf("*\n**\n***\n****\n*****\n");

    return 0;
}

方法一定不只这两种,也不是只有这两种方法才是对的,多去尝试吧!


运算子是什麽?

可能大家对运算子这个名词有点陌生,所以我们来举个一定使用过的「+ - * /」,这个加减乘除大家一定是很熟悉的,这些符号在资讯领域我们会称它为运算子;那说到加减乘除的话不可不提的,就是被运算子运算运算元了,运算元举简单的例子「3+2」来说,其中的「3」、「2」就是运算元,是会被运算子处理的资料。

可能大家现在有点头晕了,简单来说运算子负责运算、处理运算元(资料),而「3+2」这整个式子我们会称为运算式

我们来用图解结论一下:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565L0uLDuOsHp.png

然後除了这些当然还有很多很多,就不再一一介绍了,接下来我们来测试看看吧!(其他详细资讯可以到wiki这里参考)


常用运算子测试与运用

以下只是简单的介绍与测试,欢迎自己改数字等等的尝试看看。

  1. 基本的算术运算子
    (1) + - * / % (加、减、乘、除、取余)
    我们以下面的程序码来进行测试:
#include <stdio.h>

int main(){
    printf("%d\n", 5 + 2);
    printf("%d\n", 5 - 2);
    printf("%d\n", 5 * 2);
    printf("%d\n", 5 / 2);
    printf("%d\n", 5 % 2);

    printf("---我是分隔线---\n");

    printf("%f\n", 5.0 + 2);
    printf("%f\n", 5.0 - 2);
    printf("%f\n", 5.0 * 2);
    printf("%f\n", 5.0 / 2);

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565T3cg9zDhM8.png

其中如果不看printf语法(之後会再提),比较特别的大概是「%」了,它是用於取余数的运算子,所以「5%2」时会列印出无法被整除的余数「1」;而「/」则是因为在程序码中,若其运算的两个运算元都是整数,会预设输出可以被整除的商「2」。

而如果运算的两个运算元有一方或双方为浮点数(小数),输出就会为浮点数了,但输出为浮点数的情况下就不能使用「%」。

(2) + - (正负号)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    printf("%d\n", + 2);
    printf("%d\n", - 2);

    printf("---我是分隔线---\n");

    printf("%f\n", + 2.0);
    printf("%f\n", - 2.0);

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565lPBwkbTvar.png

(3) ++ -- (递增、递减)
这里我们就不多介绍了怕太混乱,有兴趣的朋友可以自行爬文,查查看它的使用方式。
(或是可以查看这个网页的介绍,写的很清晰也有解释前缀後缀时的差异)

  1. 基本的比较运算子

以下范例若列印出1为ture、0则为false。
(1) > < >= <= (大於、小於、大於等於、小於等於)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    printf("> 之结果:\n");
    printf("%d\n", 5 > 2);
    printf("%d\n", 2 > 5);
    printf("%d\n", 5 > 5);
    printf("------\n");

    printf("< 之结果:\n");
    printf("%d\n", 5 < 2);
    printf("%d\n", 2 < 5);
    printf("%d\n", 5 < 5);
    printf("------\n");

    printf(">= 之结果:\n");
    printf("%d\n", 5 >= 2);
    printf("%d\n", 2 >= 5);
    printf("%d\n", 5 >= 5);
    printf("------\n");

    printf("<= 之结果:\n");
    printf("%d\n", 5 <= 2);
    printf("%d\n", 2 <= 5);
    printf("%d\n", 5 <= 5);
    printf("------\n");

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565zsuU9Eass3.png

(2) != == (不等於、等於)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    printf("== 之结果:\n");
    printf("%d\n", 5 == 2);
    printf("%d\n", 5 == 5);
    printf("------\n");

    printf("!= 之结果:\n");
    printf("%d\n", 5 != 2);
    printf("%d\n", 5 != 5);
    printf("------\n");

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565xAoSSzfgVe.png

(3) && || (条件and比较、条件or比较)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    printf("&& 之结果:\n");
    printf("%d\n", (5 == 5) && (2 == 2));
    printf("%d\n", (5 != 5) && (2 == 2));
    printf("%d\n", (5 != 5) && (2 != 2));
    printf("------\n");

    printf("|| 之结果:\n");
    printf("%d\n", (5 == 5) || (2 == 2));
    printf("%d\n", (5 != 5) || (2 == 2));
    printf("%d\n", (5 != 5) || (2 != 2));
    printf("------\n");

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565YCGPZ4hW7r.png

「&&」在左右条件皆为ture的情况,输出为ture,反之则为false;「||」在左右条件任一方为ture或两方都为ture时,输出为ture,反之双方皆为false时则输出false。

(4) ! (取反逻辑)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    printf("! 之结果:\n");
    printf("%d\n", (5 == 5));
    printf("%d\n", !(5 == 5));
    printf("%d\n", (5 != 5));
    printf("%d\n", !(5 != 5));
    printf("------\n");


    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565pdWIA9fS6k.png

  1. 位元运算子
    (1) << >> (位元左移、位元右移)
    这个运算子大家应该陌生许多,在资讯领域中计算机(机器、电脑等等)通常是以二进制(0、1)的方式储存资料、运算、传输,详细的原因我们就不多讲,若有兴趣可以在自行查询,我们稍微图解一下这个运算子的使用方式。
    https://ithelp.ithome.com.tw/upload/images/20211007/20142565l2Cxiyzleu.png

我们以下面的程序码来进行测试:

int main(){
    printf("<< 之结果:\n");
    printf("%d\n", 4 << 1);
    printf("%d\n", 4 << 2);
    printf("------\n");

    printf(">> 之结果:\n");
    printf("%d\n", 4 >> 1);
    printf("%d\n", 4 >> 2);
    printf("------\n");

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565caXDxKFYeG.png

虽然大概知道怎麽使用,但大家可能还对位元运算有点模糊,下面我用小画家图解一下原因:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565u8gTFsbnye.png
(对二进制有疑惑的朋友可以另外查看这个页面,这个是介绍数字系统的)

(2) & | (位元and运算、位元or运算)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    printf("& 之结果:\n");
    printf("%d\n", 0 & 5);
    printf("%d\n", 0 & 10);
    printf("%d\n", 15 & 5);
    printf("%d\n", 15 & 10);
    printf("------\n");

    printf("| 之结果:\n");
    printf("%d\n", 0 | 5);
    printf("%d\n", 0 | 10);
    printf("%d\n", 15 | 5);
    printf("%d\n", 15 | 10);
    printf("------\n");

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565wFMnUpxecH.png

运算子跟上一个一样都是位元上的运算,而且是每个位元间的运算,都把数字转成二进制会比较好理解,前面可能没有把and、or说清楚,我们稍微图解一下。
第一步骤:我们先来了解and跟or的规则
a. and

值1 值2 输出
0 0 0
0 1 0
1 0 0
1 1 1

b. or

值1 值2 输出
0 0 0
0 1 1
1 0 1
1 1 1

第二步骤:知道了and、or的规则我们再来把进制转换一下。

十进制 二进制
0 0
5 101
10 1010
15 1111

第三步骤:转换完二进制後再进行「&」跟「|」的运算
举四个例子:
a. 0 & 5

项目 二进制 十进制
值1 0000 0
值2 0101 5
and 运算 ---- ----
结果 0000 0

b. 15 & 10

项目 二进制 十进制
值1 1111 15
值2 1010 10
and 运算 ---- ----
结果 1010 10

c. 0 | 5

项目 二进制 十进制
值1 0000 0
值2 0101 5
or 运算 ---- ----
结果 0101 5

d. 15 | 10

项目 二进制 十进制
值1 1111 15
值2 1010 10
or 运算 ---- ----
结果 1111 15
  1. 赋值运算子
    (1) = (设为某值、赋值)
    这个运算子会在往後频繁的使用到,所以一定要知道这个用法,在资讯领域中「=」的用法跟数学定义是不一样的,会用来赋予某资料一个值,虽然我们还没有教到变数,不过在下一篇会提到,这里我们先将就着看图解。
    https://ithelp.ithome.com.tw/upload/images/20211007/20142565y9FUc1mifZ.png

我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    int data;
    data = 777;
    printf("%d\n", data);
    
    data = 8787;
    printf("%d\n", data);

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565JkwhXSSzzz.png
可以看到当「data = 777;」时,data变数就存进了777,列印data时显示的结果就是777;而当我们第二次赋值时,「data = 8787;」会覆盖掉上次的值,在列印data时显示的就变成8787了。

(2) += -= *= /= %= (运算後赋值)
我们以下面的程序码来进行测试:

#include <stdio.h>

int main(){
    int data;
    data = 2;
    printf("%d\n", data);

    data += 3;
    printf("%d\n", data);

    return 0;
}

而上段程序码输出的结果会为:
https://ithelp.ithome.com.tw/upload/images/20211007/20142565qL7mcYs6Iz.png

其实这类的运算子是由两个步骤组成,先进行算术运算、最後再赋值,就不多做其他的例子了,有兴趣可以自行尝试看看这些运算子,而+=时如下图解。
https://ithelp.ithome.com.tw/upload/images/20211007/20142565DKAWa5fMRY.png


辛苦看到这里的你,可能已经开始有点小混乱了吧,你已经很棒啦,基本上比较会使用到的就是这些了,可以多多尝试帮助自己记忆,也能更理解这些用法。

下一篇我们来学习什麽是资料型态!


<<:  面向服务的架构 (SOA)、Web 服务和微服务

>>:  What is The Best Way to Save Emails in Outlook?

[Day 27]-【STM32系列】UART/USART RX 资料接收篇(下)

昨日[Day 26]-【STM32系列】UART/USART TX 资料传送篇(上)我们体验了UAR...

LeetCode解题 Day18

282. Expression Add Operators https://leetcode.com...

Day12-JDK堆内存快照工具-jmap(二)手动导出内存映像文件

前言 上一篇介绍了jmap基本的应用,接着就要讲jmap的重点!!导出内存映像文件,而导出的方式分为...

设置PHP环境变数

开发环境 Windows系统开发PHP的主流环境有两种:wamp和xampp。网路上有很多教学了,这...

【Day25】 Transformer 实作包(二)

开始施工 今天我们要来制作 Transformer Decoder 的部分,一样先上个图方便施工 以...