上一课是 C语言探索之旅 | 第一部分第六课:变量的世界(三),显示变量内容

今天,我们一起来学习 C语言(对大多数编程语言也类似)中的运算。

之前的课中,我们已经说过:电脑是一台“笨笨”的机器,只会做计算。

不管你是用电脑来听音乐,还是用电脑来看电影,玩游戏,其实电脑只是在做运算。不然怎么叫“计算机”呢?

这一课我们一起来学习电脑能实现的大多数运算。我们会继续使用上一课学到的变量的知识。其实,就是对变量做加,减,乘,除,取模,等等各种操作。

即使你对数学不感兴趣,这一课也是必不可少的。硬着头皮上吧~

https://jq.qq.com/?_wv=1027&k=fvGk4MIo

2. 基础运算

说到基础运算,无外乎:

  • 取模 (如果你是第一次听说,不用担心,我们后面会解释)

其实你的电脑也只知道做这些基础运算,如果你要它做更复杂的运算(平方,乘方,对数,等),那你需要编程才行,就是说你需要向电脑解释怎么做。

但是,很幸运的是,在这一课中我们会看到其实 C语言已经设计好了数学库(关于库的知识,请看以前的课程。简单地说就是已经编写好的,可以供你的程序调用的各种变量和函数的集合),你只要用专家定义好的库里面的内容就好了,不需要自己重复“造轮子”。

一开始,我们从加法开始看吧。

为了在 C语言中做加法,我们要用到 + 号。不开玩笑,就是这么简单。

你要把加法的结果放到一个变量里面。我们就来创建一个整数类型的变量,取名叫 result(表示“结果”)。

int result = 0;
result = 4 + 6;
复制代码

不必是专业数学家,也可以猜想到程序运行后 result 的值会变为 10,我们用 printf 函数来输出结果:

printf("4 + 6 = %d", result);
复制代码

运行程序,显示:

4 + 6 = 10
复制代码

看吧,加法就是这么简单,一点也不任性。

对于其他的运算类型,也是同样的原理。只有运算符不同,见下表:

运算符号加法+减法-乘法*除法/取模%

如果你曾经使用过电脑上的计算器,你肯定知道这些符号。除了最后两个(除和取模),其他应该很熟悉。我们就来说说最后两个符号。

除法

当没有余数时,除法运行得好好的。比如,6 / 3 等于 2,你的电脑给了你正确的答案。到这里为止还没有问题。

但是,我们假如让电脑做 5 / 2,按理结果应该是 2.5。但是,来看看我们的程序:

int result = 0;
result = 5 / 2;
printf ("5 / 2 = %d", result);
复制代码

运行程序,显示:

5 / 2 = 2
复制代码

我们让电脑计算 5 / 2,期待的结果是 2.5,但是实际上电脑却给出了 2。这不是“很二”嘛... 亲爱的电脑,你怎么可以这样对我?

其实,内有蹊跷。难道我们的电脑真的在这点上这么蠢笨吗?

事实上,当电脑看到数字 5 和 2 时,它会做一个整数之间的除法(也叫做“欧几里得除法”),就是说它会把结果截取一段,只留下整数部分(这里是 2)。

你也许会说:“啊,我知道了,都是因为 result 这个变量是整数类型嘛。如果把 result 声明为 double 类型的浮点数,那它应该可以储存带小数点的数啦。”

其实不然,这不是原因。假如你把 result 声明为 double 类型,运算 result = 5 / 2,你还是会得到 2。事实上,这是因为 / 运算符两边的数是整数,所以电脑会做整数之间的除法。

当然,也是可以让电脑输出你想要的结果的,怎么办呢?看下面程序:

double result = 0;
result = 5.0 / 2.0;
printf ("5 / 2 = %f", result);
复制代码

运行,显示:

5 / 2 = 2.500000
复制代码

看到了吗,如果要你的电脑显示正确结果,还需要你把运算符两边的数写成 5.0 和 2.0(同样是 5 和 2,但是电脑却认为这两个是浮点数,因此它就做浮点数的除法)。怎么样,电脑任性不?

这个整数除法的特性很重要。所以得记住,对于电脑来说:

5 / 2 = 210 / 3 = 34 / 5 = 0
复制代码

有点令人吃惊,不是么?但这就是电脑做整数运算的方式。

如果你想要得到浮点数的结果,需要运算的数本身是浮点数(提一下,其实不需要两个数都是浮点数,一个是浮点数就够了,电脑会自动把另一个也认为是浮点数来做运算):

5.0 / 2.0 = 2.510 / 3.0 = 3.333334.0 / 5 = 0.8
复制代码

事实上,在做整数除法时,比如 5 / 2,你的电脑会回答下面问题:“5里面有多少个 2 ?”,答案是两个。同样的,“10 里面有多少个 3 呢”,答案是三个。

然后你又会问了,我们怎么才能获取到除法剩下的数(余数)呢?

这就要轮到取模运算出场了。

取模

取模运算是获得除法的余数的一种数学运算。可能相比 加、减、乘、除这基本的四则运算来说,它没有那么被人熟知,但对电脑来说,取模是基本的运算之一。很有可能是为了解决上面提到的整数除法的难题。

上面表格里列出来了,取模的符号是 %

以下列出一些取模运算的例子:

5 % 2 = 114 % 3 = 24 % 2 = 0
复制代码

取模运算 5 % 2 是除法运算 5 / 2 的余数,所以是 1。电脑计算 5 = 2 * 2 + 1 ,所以取模运算就得出 1 为结果。

同样地, 14 = 3 * 4 + 2 ,所以余数为 2。

4 = 2 * 2 ,所以余数为 0。

好了,我宣布一个好消息:“我们已经学了所有的基础运算了。数学课下课了~”

3. 变量之间的运算

诶,变量之间的运算?

怎么数学老师刚走,又来了数学教授啊?没办法,电脑又名计算机,肯定要跟数学打点交道的嘛。幸亏来的不是“叫兽”。

既然我们在上面一节中已经学习了基础的 5 种运算,那现在可以来看看变量之间的运算咯。

事实上,变量之间的运算也是同理。

result = number1 + number2;
复制代码

上面这一行代码对 number1 和 number2 这两个变量做加法运算,并且把结果储存到 result 这个变量里。

现在我们的学习越来越有意思了。其实你现在已经可以实现一个迷你的计算器的功能了,不要怀疑自己,你可以的。

想象一个程序,请求用户输入两个数,这两个数,你将其储存在变量里。

然后,你对这两个变量做加法,并且把结果储存在另一个变量里。接下来,你就只需要把计算的结果显示在屏幕上就好了,让用户看看电脑的本领,很多人做加法可没有这么快速呢!

试着自己编写以上程序,很简单的,也可以给你练手。

当然了,我们还是把代码写上:

#include <stdio.h>int main(int argc, char *argv[]) {int result = 0, number1 = 0, number2 = 0;// 请求用户输入number1和number2的值:printf("请输入数字1 : ");scanf("%d", &number1);printf("请输入数字2 : ");scanf("%d", &number2);// 做运算:result = number1 + number2;// 把运算结果显示在屏幕上 :printf ("%d + %d = %dn", number1, number2, result);return 0;
}
复制代码

运行,显示:

请输入数字1 : 289
请输入数字2 : 376
289 + 376 = 665
复制代码

可能你还没意识到:这是我们第一个有点意思的程序。我们的程序请求用户输入两个数,然后做加法,再把结果输出到屏幕上。很棒吧!

请你自己也试着用其他四个基础运算符来写程序,看看结果如何。

4. 缩写

之前我们保证过,不会再有新的运算形式出现了。确实如此,我们已经知道了所有的基础运算:加、减、乘、除、取模。用这些基础运算我们可以做所有事情。不需要其他的运算了。

我知道这很难令人相信。你会说难道一个很复杂的 3D 游戏最终也是由加、减、乘、除等构成的?是的,确实如此。

虽然如此,但是在 C语言里我们还可以进行运算的缩写。

为什么要缩写呢?因为很多时候我们做的运算都是重复的。下面你就会看到缩写的好处了。

自增运算

你会发现你在编程中经常要对一个变量进行 +1 操作。

假设你的变量名字是 number,你知道怎么对它进行 +1 操作吗?是这样做的:

number = number + 1;
复制代码

上面的语句做了什么呢?

首先我们做运算 number + 1,然后我们把运算结果储存到变量 number (它自己)中。

因此,假如我们的变量值是 4,运算后变成 5 了,假如它的值是 8,那会变成 9,依此类推。

这个运算是重复的。要知道,计算机科学家都是很懒的人,他们可不希望输入两遍 number(确实也挺累人的)。

于是他们发明了一个缩写形式,叫做自增运算。它的结果和 +1 操作是一样的:

number++;
复制代码

这一行代码,就是用了自增运算符 ++,是不是比刚才那句 number = number + 1 简单了?它意味着“对 number 做 +1 运算”。

敏锐的读者可能想到了,编程语言 C++ 的 ++ 符号其实正是自增运算符的意思。我以前也不太理解为什么不是 C+,而是 C++。

原来计算机科学家跟大家开了一个很有意味的玩笑:C++ 意味着对 C 做 +1 操作,表示“比 C语言多一点”。

当然了,事实上 C++ 只是用不同的方式来编程,并不是说 C++ 比 C语言更优秀,只是不同而已。

自减运算

知道了自加运算的原理,自减运算应该不难理解吧:就是对变量进行 -1 运算。

number--;
复制代码

其他的缩写形式

同理,其他还有好几种运算的缩写形式。比如 number = number * 2; 可以写成 number *= 2;

看以下代码:

int number = 2;number += 4;  // number 变为 6
number -= 3;  // number 变为 3
number *= 5;  // number 变为 15
number /= 3;  // number 变为 5
number %= 3;  // number 变为 2(因为 5 = 1 * 3 + 2)
复制代码

5. 数学库

在 C语言中,我们有一些称之为“标准库”的东西,就是那些很实用的库。我们一般会经常使用那些基础库。

复习一下:库就是指已经定义好的函数和变量的集合。这些函数由前人写成,可以避免我们重复“造轮子”。

我们已经使用过 stdio.h 库中的 printf 和 scanf 这两个函数了。

其实还有很多其他很实用的库,其中就有一个叫 math.h,里面包含了与数学相关的函数。

实际上,光是加、减、乘、除、取模是不够的。虽然底层都是这五个运算,但是很多时候我们需要做复杂的运算形式,就需要调用库或者自己写函数了。

因为电脑并没办法理解除了 +,-,*,/,% 之外的运算符,比如你如果要电脑做乘方,输入 5 ^ 2 ,电脑完全不理解什么意思,除非你调用数学库里已经定义好的做乘方的函数。

调用数学库很简单,

#include <math.h>
复制代码

只要用这一行代码,接下来你的程序就可以用里面定义的所有函数了。

我们介绍其中几个最常用的吧。

fabs

这个函数返回绝对值:

  • 如果你传给这个函数 -53,它会返回 53 。
  • 如果你传给这个函数 53,它会返回 53 。
double absolute = 0, number = -29;
absolute = fabs(number);   // absolute 的值变为 29
复制代码

ceil

这个函数返回给出的浮点数后面紧接的整数。这是一种舍入的方式。ceil 函数总是舍入紧邻的比参数大的整数。

double above = 0, number = 34.81;
above = ceil(number);  // above 的值变为 35
复制代码

floor

这个函数与 ceil 的作用相对,返回给出的浮点数前面紧接的整数。

double below = 0, number = 45.63;
below = floor(number);   // below 的值变为 45
复制代码

pow

这个函数计算数字的乘方。你要给它两个参数:底数和指数。

double result = 0, number = 2;
result = pow(number, 4);  // result 的值变为 16(2 ^ 4 = 16)
复制代码

sqrt

这个函数返回参数的平方根。返回值是 double 类型。

double result = 0, number = 100;
result = sqrt(number);  // result 的值变为 10
复制代码

sin, cos, tan

这三个函数是计算正弦,余弦,正切的值。

asin, acos, atan

这三个函数是计算反正弦,反余弦,反正切的值。

exp

这个函数是特殊的乘方形式,返回以 e(自然对数的底数,近似等于2.7182)为底数的指数运算的值。

正在跳转​jq.qq.com

shell 做加法运算_C语言探索之旅 | 第一部分第七课:运算那点事相关推荐

  1. c语言min函数_C语言探索之旅 | 第一部分第十课:第一个C语言小游戏

    内容简介 前言 准备工作和建议 我的代码 改进方案 第一部分第十一课预告 1. 前言 上一课是 C语言探索之旅 | 第一部分第九课:循环语句 . 经过前面这么多课的努力,我们终于迎来了第一个比较正式的 ...

  2. R 语言怎么保存工作目录到当前路径_C语言探索之旅 | 第二部分第七课:文件读写...

    内容简介 前言 文件的打开和关闭 读写文件的不同方法 在文件中移动 文件的重命名和删除 第二部分第八课预告 1. 前言 上一课 C语言探索之旅 | 第二部分第六课:创建你自己的变量类型 之后,我们来学 ...

  3. C语言探索之旅 | 第一部分第三课:你的第一个程序

    作者 谢恩铭,公众号「程序员联盟」. 转载请注明出处. 原文:https://www.jianshu.com/p/c73fecacd006 <C语言探索之旅>全系列 内容简介 前言 控制台 ...

  4. c 字符串数组_C语言探索之旅 | 第二部分第四课:字符串

    内容简介 前言 字符类型 显示字符 字符串其实就是字符的数组 字符串的创建和初始化 从 scanf 函数取得一个字符串 操纵字符串的一些常用函数 总结 第二部分第五课预告 1. 前言 上一课 C语言探 ...

  5. c语言remove和rename不起作用,C语言探索之旅 | 第二部分第七课:文件读写

    我们学过了这么多变量的知识,已经知道变量实在是很强大的,可以帮助我们实现很多事情. 变量固然强大,还是有缺陷的,最大的缺陷就是: 不能永久保存 . 因为 C语言的变量储存在内存中,在你的程序退出时就被 ...

  6. c语言 如何创建adt_C语言探索之旅 | 第二部分第六课:创建你自己的变量类型

    内容简介 前言 定义一个 struct 结构体的使用 结构体指针 union enum 总结 第二部分第七课预告 1. 前言 上一课是 C语言探索之旅 | 第二部分第五课:预处理 ,应该是比较轻松的. ...

  7. C语言探索之旅 | 第一部分第二课:工欲善其事,必先利其器

    -- 作者 谢恩铭 转载请注明出处 上一课C语言探索之旅 | 开宗明义及第一部分第一课:什么是编程?中,我们说了,程序员需要具备三个特质: 耐心,逻辑,冷静. 我突然感觉到还需要第四大特质---谦虚 ...

  8. C语言探索之旅 | 第二部分第六课:创建你自己的变量类型

    -- 简书作者 谢恩铭 转载请注明出处 第二部分第六课:创建你自己的变量类型 上一课C语言探索之旅 | 第二部分第五课:预处理之后,我们进入令人激动也非常有意思的一课. 众所周知,C语言是面向过程的编 ...

  9. Linux 探索之旅 | 第一部分第四课:磁盘分区 + 完成 Ubuntu 安装

    -- 作者 谢恩铭 转载请注明出处 内容简介 第一部分第四课:磁盘分区+完成Ubuntu安装 第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区+完成Ubuntu安装 上一课Linux探索之 ...

最新文章

  1. 清华大学提出APDrawingGAN,人脸照片秒变艺术肖像画
  2. 请问.NET如何实现分布式系统?
  3. pythondistutils安装_python – 与distutils / pip一起安装Bash完成
  4. sigslot库源码分析
  5. postgresql定义访问ip与用户_Postgresql-12.1最新版本在线安装以及配置使用全流程
  6. python whl_python whl是什么文件
  7. 【2017年第1期】智慧城市多源异构大数据处理框架
  8. 刷题笔记2020-06-26
  9. 多学一点(五)——在Linux下安装配置Apache
  10. 4.2号 作业讲解
  11. react-native 开发在Android模拟器上运行
  12. LINUX 导出文件夹到本地
  13. Deep Speaker: an End-to-End Neural Speaker Embedding System
  14. Laravel框架--路由
  15. springMVC注解的意思
  16. vim 日常使用高级篇幅
  17. [转载]三、二、一 …… Geronimo!,第 4 部分: 模式
  18. 数据防泄密系统,你了解多少呢?
  19. Java 在线编程编译工具上线,直接运行Java代码
  20. php验证码实现的代码怎么写,php验证码实现代码

热门文章

  1. 【城市沙龙】LiveVideoStack Meet|合肥:在“霸都”邂逅音视频技术
  2. 【线上分享】WebRTC传输与服务质量
  3. 跨国实时网络调度系统设计
  4. 模仿黑产破解12306验证码,验证码产品的未来是?
  5. FFmpeg源代码:avcodec_send_packet
  6. linux编译openssl
  7. springMVC各种注解及解释和使用
  8. ZooKeeper实战(三):ZooKeeper实现分布式配置中心、分布式锁、Reactive响应式模型
  9. Java程序员需要掌握的计算机底层知识(四):内存管理
  10. 【Python】Effective Python 读书笔记