C++ 中的除法
这篇文章是关于 C++ 中的除法规则的。
首先,我们将研究除法的优先级和类型转换规则。 稍后,我们将讨论一种常见的整数除法特性,称为截断转换。
C++ 中的优先级和关联性规则
术语优先级指定表达式中运算符的评估顺序。 例如,一些C++运算符的优先级规则从最高层到最低层如下:
- 写在括号中的表达式首先被求值。
-
运算符
*
和\
具有相同的优先级。 -
同样,运算符
+
和-
具有相同的优先级。 - 如果一个表达式中出现两个具有相同优先级的运算符,则运算符从左到右计算(赋值运算符(=)除外。它也称为运算符结合性。
例如,考虑以下混合表达式:
(1*2)+3/3*2-1
上面的表达式按以下方式计算:
-
在第一遍中,首先评估 * 运算符,因为它包含在具有最高优先级的括号中。 第一遍之后,表达式变成了这样的
2+3/3*2-1
。 -
/ 运算符首先在第二遍中进行评估。 尽管运算符 * 和 / 具有相同的优先级,但是具有相同优先级的运算符是从左到右计算的。 第二遍之后,表达式看起来像
2+1*2-1
。 - 在第三遍中,计算乘法运算符,因为它在表达式中的其他运算符中具有最高优先级。 第三遍后,表达式将减少为 2+2-1。
-
+
运算符首先在第四遍中求值。 尽管运算符 + 和 - 具有相同的优先级,但是具有相同优先级的运算符是从左到右计算的。 第四节过后,比分变为4-1。 - 最后,- 运算符被求值,我们将表达式缩减为单个值 3。
现在,我们对运算符优先级和结合性有了充分的了解。 让我们看看 C++ 中 / 运算符的一些特性。
C++ 中整数除法的特殊性
当我们在 C++ 中除以两个整数时,除法运算符仅返回答案的整数部分。 答案的小数部分被截断。
主要原因是编译器的隐式类型转换。 在开始类型转换之前,让我们看一个整数除法的例子。
#include<iostream>
using namespace std;
int main() {
int m = 10;
int n = 7;
float a = m / n;
cout << "The answer after division is:" <<a<<endl;
}
输出结果如下:
The answer after division is:1
输出确认 C++ 编译器跳过了答案的小数部分。 让我们首先了解类型转换,以了解这种特殊性的根本原因和可能的解决方案。
类型转换和解决 C++ 中整数除法的特殊性
类型转换意味着改变变量的类型。 类型转换可以是隐式的也可以是显式的。
显式类型转换
这是由程序员明确执行的。 关键字 static_cast
用于显式类型转换。
这种类型的转换是在编译时完成的。
以下代码使用显式类型转换解决了整数除法问题。 下面代码的第 6 行静态地将 m 和 n 的值转换为浮点值; 因此,除法的结果也将是一个浮点数。
#include<iostream>
using namespace std;
int main() {
int m = 10;
int n = 7;
float a = static_cast<float>(m)/ static_cast<float>(n); //static explicit casting
cout << "The answer after explicit typecasting is: " <<a<<endl;
}
输出结果如下:
The answer after explicit typecasting is: 1.42857
隐式类型转换
隐式类型转换由编译器自动执行。 编译器根据表达式中使用的数据类型评估表达式。
编译器总是在给定表达式中使用的所有数据类型中以更高的数据类型评估结果。
隐式转换是整数除法特性的根本原因。 当两个整数操作数与算术除法一起使用时,评估将隐式转换为 int 数据类型,从而导致结果的小数部分被修剪掉。
我们可以通过将一个除法操作数的类型更改为某种浮点类型来解决整数除法问题,如下面的代码所示:
#include<iostream>
using namespace std;
int main() {
float a = 10.0/7;
cout << "The answer after implicit typecasting is: " <<a<<endl;
}
输出结果如下:
The answer after implicit typecasting is: 1.42857
在上面的例子中,分子 10.0 是浮点值,分母是整数值。 由于 float 数据类型高于 integer 数据类型,编译器将结果值隐式转换为 float 数据类型。
还有一些与 C++ 中的除法运算符相关的其他特性,例如零错误除法和指针除法,极客们可以进一步探索这些特性。
相关文章
Arduino 复位
发布时间:2024/03/13 浏览次数:315 分类:C++
-
可以通过使用复位按钮,Softwarereset 库和 Adafruit SleepyDog 库来复位 Arduino。
Arduino 的字符转换为整型
发布时间:2024/03/13 浏览次数:181 分类:C++
-
可以使用简单的方法 toInt()函数和 Serial.parseInt()函数将 char 转换为 int。
Arduino 串口打印多个变量
发布时间:2024/03/13 浏览次数:381 分类:C++
-
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。