为什么括号在这个简单的代码中会有所不同

Why do parentheses make a difference in this simple code

本文关键字:代码 有所不同 简单 为什么      更新时间:2023-10-16

当我在此浮点数中添加两个括号时,输出变为零。

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中,int20 被转换为double,得到一个值为 20 的double
  • 然后将double值 12 和 20 相乘,得到double值 240。
  • 然后(12.00*20)/100double240 除以int100。
  • int100 转换为double100。
  • 然后将double240 除以double100,产生大约 2.4 的double值(使用 IEEE-754 二进制 64 时,正好是 2.399999999999999999111821580299874747666109466552734375(。

相反,评估12.00*(20/100)

  • 20100都是int值,因此20/100是使用除法执行intint除法会产生丢弃分数的int结果。因此,结果是int值 0。
  • 然后12.00*(20/100)double值 12 乘以int值 0,得到 0。

总之,有两件事在起作用:

  • 给定一个表达式a*b/c其中两个运算符*/具有相同的优先级,则它们的结构为首先执行左侧操作。(这是乘法运算符的规则。某些运算符(如赋值(从右到左关联。
  • 带有int操作数的乘法或除法是用int算术完成的,即使整个表达式在其他地方包含double操作数也是如此。在混合intdouble操作数的乘法中,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因为乘法运算符和除法运算符具有优先级顺序,并且它们具有从左到右的关联性。这些操作是通过将20100提升到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;
}