Skip to content

L1-06 数学表达式

数学表达式

我们要计算机帮我们完成各种各样有难度的任务,都离不开做运算的过程。所有的运算都需要运算符连接,用以告诉计算机我们要做的是哪一种运算。

在写程序的时候我们可能会用到 + - * () 这些符号,和我们在数学上进行四则运算的 + − × () 相对应,实际上四则运算中的除法 ÷ 在计算机语言上也有对应的符号 / 。这些符号都被称为运算符,是用来对值或变量做运算的,计算机语言中还有很多有趣的运算符,比如三目运算符 ? : ,一元运算符 ! ,让我们通过之后两节的学习来认识这些有趣的运算符吧!

算术运算符

运算符名称运算符符号数学符号举例备注
加号++1+1 -> 2
减号--5-3 -> 2
乘号*×7*6 -> 42书写形式不同
除号/÷18/3 -> 6注意变量类型
取余%14%3 -> 2计算机特有
括号()()(1+2)*3->9

加减乘法括号

计算机语言中的算术运算符+ - * 与四则运算中的+ - * 用法相同,都是用来计算两个数的和或差的。在 C++ 中,乘除法的优先级也高于加减法,所以这个时候与数学运算类似,可以通过括号改变运算的优先级。

需要注意的是,在计算机语言中,+ - * 可以代表其他的含义,以 - 为例,当其不用在两个量(变量或值)之间而是用在某一个量(记为 a ) 的前面时,用来使这个整体等于 a 的相反数。

text
a=-9  //-a->9
b=7   //-b->-7

但需注意,当 - 表示负号时,即使用在变量前面,只会让 “-变量”这个整体的值等于变量本身的值的相反数,不会改变变量里面存储的值。

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a;
    a = 3;
    cout << -a << endl;
    cout << a << endl;
    return 0;
}

输出内容如下:

text
-3
3

单选题

运行下面这段程序,将会输出()?

c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n = 60000;
    long long m = n * n;
    if (m > 100000000)
        cout << "Yes";
    else
        cout << "No";
    return 0;
}

A. Yes

B. No

题解

B

1、因为你的n是int型的,n*n也int类型它超出了int的范围,所以溢出,就变成负数      因此输出:No 2、若把int 改为long long 则输出Yes

除法

为什么要把除法单独列出来呢?因为计算机中的除法有其特殊之处。

我们试着运行下面这份代码:

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    a = 5;
    b = 2;
    cout << a/b << endl;
    return 0;
}

我们都知道 5 除以 2 等于 2.5 ,那么我们就来运行一下看看计算机怎么说。

text
2

看到结果是 2 的同学是不是有一种把电脑送去维修的冲动?

又或者怀疑自己学了假的除法?

其实这和 C++ 语言的取整操作有关,我们看到 a,b 这两个变量的数据类型都是 int ,即三个变量存储的值都是整数,那么他们运算得到的结果也必须是整数,于是就只取其 2.5 的整数部分作为 a/b 的结果,因此我们看到输出的 a/b 的值为 2 。

那么再来看下面这份代码:

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int c;
    c = 5.0/2.0;
    cout << c << endl;
    return 0;
}

好嘛!现在是两个小数进行运算了,总能输出正确的结果 2.5 给我了吧?

来运行一下看看:

text
2

咦?怎么还是 2 啊?

其实关键在于存储 5.0/2.0 的这个变量 c,变量 c 的数据类型是 int ,意味着 c 只能用来存储整数,所以和刚才一样,取了 2.5 的整数部分 2 存入变量 c 中。解决办法是将 c 的变量类型改成 double 型。

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    double c;
    c = 5.0 / 2.0; 
    cout << c << endl;
    return 0;
}

取余运算符%

取余运算符的运算法则很简单,正如他的名字一样,是用来计算余数的。

用数学语言来描述就是: 若 a=q∗b+r ,其中 0<=r<b ,则 a

例:

text
18%4=2
8%3=2
23%8=7

注: 取余运算又称取模

单选题

下列取余计算结果正确的是(  )。

A. 15%4=3

B. 23%6=3

C. 12%2=6

D. 5%2=2

题解

A

15%4=3 23%6=5 12%2=0 5%2=1

单选题

假定 x 和 y 是整型,值分别是 18 和 4,则 x%y 和 x/y 的值分别为 2 和 4.5。

A. 正确

B. 错误

题解

B

因为x和y都是整型,且x=18,y=4 所以:x%y=2  x/y=4

数学表达式

单选题

所有的表达式都有值

A. 正确

B. 错误

题解

所有的表达式都有值

在为变量赋值的内容中,我们讲解了很多种为变量赋值的方法,等号(=)右边的部分,都可以统称为数学表达式。

text
int a = 3, b = 4, c = 5, d;
d = a * b + c; //d = 17

其中 a∗b+c 就是一个数学表达式。使用数学表达式赋值,等号(=)左边一定是单独的变量,不可以是另一个表达式,例如:

text
int a = 3, b = 4, c = 5, d;
d + c = a * b;

这段程序会产生编译错误。此外,还有一些特殊的表达式赋值方法,例如:

text
int a = 3, b = 4, c = 5;
a += c + 1; // a = 9
b *= c + 1; // b = 24

这段程序等同于下面的程序:

text
int a = 3, b = 4, c = 5;
a = a + (c + 1); // a = 9
b = b * (c + 1); // b = 24

在之前讲解强制类型转换时,我们曾以 int 和 long long 为例,讲解过表达式计算的规则,这里再重复强调一下。

text
#include <bits/stdc++.h>
using namespace std;
 
int main() { 
    int a = 5;
    double b = a / 2;
    cout << b;
    return 0;
}

这段程序输出的结果为 2 。

text
2

如果需要得到准确的结果,请将程序改为:

text
#include <bits/stdc++.h>
using namespace std;
 
int main() { 
    int a = 5;
    double b = a * 0.5;
    cout << b;
    return 0;
}

单选题

下面数学表达式赋值正确的是(  )。

A. int a = 3, b = 4, c = 5, d; d = a * b + c;

B. int a = 6, b = 9, c = 3, d; d + c = a * b;

C. int a = 2, b = 1, c = 4, d; c/a= b * d;

D. int a = 3, b = 4, c=15, d; a* b = c - d;

题解

A

正确的赋值语句,等号的左边只能有一个变量

C++运算符概述

本章的内容是数学表达式,我们知道一个数学表达式是由变量、数字、括号以及算数运算符组成的。

除了数学表达式, C++ 中还有逻辑表达式。逻辑表达式同样是由变量、数字、括号以及逻辑运算符组成的。

不同的表达式使用不同的运算符, C++ 中的运算符可以简单划分为几类:

  1. 算术运算符
  2. 关系运算符
  3. 逻辑运算符
  4. 位运算符
  5. 赋值运算符
运算符
算术运算符+, −, ∗, /, %, ++, −−
关系运算符==, !=, >, <, >=, <=
逻辑运算符&&, |, !
位运算符&, |, ^, <<, >>
赋值运算符=, +=, −=, ∗=, /=

这些运算符的定义,并非天生被 C++ 支持,比如 double 类型,不支持 % 运算。每种运算符,只被某些类型采用。

未来还会学到自己定义新的类型,对于这些类型,我们可以自己定义运算符的计算处理方法,这里不展开讲解。

习题

课堂练习:启蒙练习-取余V2

给出两个正整数a,b,请你求出a除以b的商与余数。

输入格式

输入两个数a,b,以空格隔开。

输出格式

输出两个整数,分别表示商和余数,以空格隔开。

输入样例

text
5 3

输出样例

text
1 2

数据范围

对于35%的数据,1≤a,b≤500; 对于100%的数据,1≤a,b≤10000;

c++
#include <bits/stdc++.h>
using namespace std;
int main() {
  int a, b;
  cin >> a >> b;
  cout << a / b << ' ' << a % b << endl;
  return 0;
}

按照题目要求,声明 2 个变量 x,y ,然后利用 cin 读取 x,y 输入的值。

两个 int 类型的变量做除法,得到的结果也是整数,而不是小数,因此直接输出 x/y 和 x%y 的结果即可。

注意: 2 个结果中间需要输出空格。

课后作业:启蒙练习-矩形

已知有一个矩形,它的长和宽分别为a,b,请你求出这个矩形的周长和面积。

输入格式

输入两个数a,b,分别表示矩形的长和宽。

输出格式

输出两个数,分别表示矩形的周长和面积。

输入样例

text
2 4

输出样例

text
12 8

数据范围

对于20%的数据,1≤a,b≤20; 对于100%的数据,1≤a,b≤10000;

c++
#include <bits/stdc++.h>
using namespace std;
int main() {
  long long a, b;
  cin >> a >> b;
  cout << (a+b)*2 << ' ' << a * b << endl;
  return 0;
}

按照题目要求,声明 2 个变量 a,b ,分别用于存储矩形的长和宽,然后利用 cin 读取 a,b 输入的值,输出 (a+b)×2 和 a×b 的结果。注意中间输出空格。