为什么括号在这个简单的代码中会有所不同
Why do parentheses make a difference in this simple code
当我在此浮点数中添加两个括号时,输出变为零。
int main()
{
float a=12.00*(20/100);
cout <<a<<endl;
}
如果我去掉括号,输出将是 2.4 但是如果我保留它,输出将为零.为什么???
12.00*20/100
被解析为(12.00*20)/100
并被计算:
- 由于
12.00
包含一个小数点;它是一个值为 12 的double
。 20
是值为 20 的int
。- 在
12.00*20
中,int
20 被转换为double
,得到一个值为 20 的double
。 - 然后将
double
值 12 和 20 相乘,得到double
值 240。 - 然后
(12.00*20)/100
将double
240 除以int
100。 int
100 转换为double
100。- 然后将
double
240 除以double
100,产生大约 2.4 的double
值(使用 IEEE-754 二进制 64 时,正好是 2.399999999999999999111821580299874747666109466552734375(。
相反,评估12.00*(20/100)
:
20
和100
都是int
值,因此20/100
是使用除法执行int
。int
除法会产生丢弃分数的int
结果。因此,结果是int
值 0。- 然后
12.00*(20/100)
将double
值 12 乘以int
值 0,得到 0。
总之,有两件事在起作用:
- 给定一个表达式
a*b/c
其中两个运算符*
和/
具有相同的优先级,则它们的结构为首先执行左侧操作。(这是乘法运算符的规则。某些运算符(如赋值(从右到左关联。 - 带有
int
操作数的乘法或除法是用int
算术完成的,即使整个表达式在其他地方包含double
操作数也是如此。在混合int
和double
操作数的乘法中,int
操作数转换为double
。
当您使用
float a=12.00*(20/100);
在将该项的结果乘以12.00
之前,首先计算项(20/200)
项。这是因为括号术语的优先级高于乘法运算符。20/100
是使用整数除法计算的,这会导致0
.
当您使用
float a=12.00*20/100;
术语12.00*20/100
被评估为(12.00*20)/100
因为乘法运算符和除法运算符具有优先级顺序,并且它们具有从左到右的关联性。这些操作是通过将20
和100
提升到double
来执行的。因此,你会得到预期的答案。
我认为这里值得一提的重要事情,强烈建议在 mordern C++、整数和浮点文字中。
正如大多数答案中已经提到的,默认情况下,C++没有文字的数字称为整数类型。但是在 mordern C++ 中,您可以使用浮点文字"f"来指定类型。
因此,通过这种方式,您知道如何显式地让编译器知道您要绑定使用哪种类型的数字并获得预期的结果。
在下面的例子中,(20.0f/100.0f( 不再被引用为整数类型,在这里我显式指定编译器将这些数字视为浮点类型。
(请记住,即使使用 20.0 默认情况下也被视为双精度类型而不是浮点类型。
示例,请尝试以下操作:
#include <iostream>
int main()
{
auto a = 12.0f * (20.0f/100.0f);
std::cout <<a<<std::endl;
}
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么括号在这个简单的代码中会有所不同
- 为什么对于几乎相同的代码,矢量化的行为会有所不同
- 为什么如果使用优化(-O2、-O3),此代码的行为会有所不同
- 在C++程序中使用_asm代码会有所不同吗?