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++ 中的除法运算符相关的其他特性,例如零错误除法和指针除法,极客们可以进一步探索这些特性。
相关文章
在 C++ 中通过掷骰子生成随机值
发布时间:2023/04/09 浏览次数:169 分类:C++
-
本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。
在 C++ 中使用模板的链表
发布时间:2023/04/09 浏览次数:158 分类:C++
-
本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。
在 C++ 中添加定时延迟
发布时间:2023/04/09 浏览次数:142 分类:C++
-
本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。
在 C++ 中创建查找表
发布时间:2023/04/09 浏览次数:155 分类:C++
-
本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。
如何在 C++ 中把字符串转换为小写
发布时间:2023/04/09 浏览次数:63 分类:C++
-
介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码
如何在 C++ 中确定一个字符串是否是数字
发布时间:2023/04/09 浏览次数:163 分类:C++
-
本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。
如何在 c++ 中查找字符串中的子字符串
发布时间:2023/04/09 浏览次数:65 分类:C++
-
本文介绍了在 C++ 中检查一个字符串是否包含子字符串的多种方法。使用 find 方法在 C++ 中查找字符串中的子字符串
如何在 C++ 中把字符串转换为 Char 数组
发布时间:2023/04/09 浏览次数:107 分类:C++
-
本文介绍了在 C++ 中把字符串转换为 char 数组的多种方法。使用 std::basic_string::c_str 方法将字符串转换为 char 数组