c ++如何评估涉及双数据类型的模数的数学表达式?

时间:2013-10-17 08:26:21

标签: c++ evaluation modulus mathematical-expressions

在以下代码中,由于编译器给出了错误

,因此无法计算表达式
#include <iostream>
int main()
{
    std::cout<< "Welcome\nto\n\nc++!\n";
   // std::cout<< "to c++ ! \n";
   double a=2;
   double b=2;
   double c=3;
   double d=4;
   double e=5;
   double f=6;
   double sum;
  sum=(a*b%c+d/e-f); // error: invalid operand of  types double and double to binary operators%
   std::cout <<"Sum is:" << (float) sum;
    return 0;
}

我知道fmod(x,y)函数可用于双精度但表达式不会保持不变,是否有其他方法我可以做或者我需要自己创建一个表达式求值器。如果是这样的话那怎么样?我是C ++的新手,请帮忙,为什么编译器不够智能呢?

1 个答案:

答案 0 :(得分:0)

二元运算符需要两个(=二进制)参数(就像函数一样),因此表达式5 + 4可以很容易地用一些函数add(5, 4)编写。

请注意您收到的错误消息,关键字:“无效操作数二元运算符%”

因此,当您想要使用fmod(仔细检查文档)并确定表达式中的右手和左手操作数时。输出取决于你如何编写表达式,这里有两种可能的方法:

fmod(a*b, c) + d/e-f这是您编写它的正确order of precedence

但是,如果我们假设您希望模数的所有内容都是分子,并且模数的所有权利都是分母,我们可以这样写:

fmod(a*b, c+d/e-f)这不等同于您的原始表达。

请注意此函数的一些documentation,其中包含参数。

在C ++中,对程序员有智能而不是编译器的期望很小。正是这种方式使程序员可以更明确地控制代码的行为方式。