2013-10-17 119 views
0

在下面的代码表达不能因为编译器来评估给我一个错误C++如何评估涉及双数据类型模数的数学表达式?

#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++的新手请帮忙,为什么编译器不够聪明?

+0

你是什么意思“不会保持不变”?你只需重写它来使用'fmod()'而不是'%'; [一个是前缀符号,另一个是中缀](http://www.cs.man.ac.uk/~pjj/cs2121/fix.html)。 – DanielKO

+0

,因为这将改变优先顺序,它将在乘以'a * b'之前计算mod'fmod(b,c)',同时在BODMAS中我们从左到右移动 –

+0

通过“重写它来使用'fmod() ''我的意思是你在保持相同意义的同时重写。你检查了我发布的链接吗?可以将'a + b * c + d'改写为'add(add(a,(mul(b,c)),d)'。不要只是推入'fmod',找出评估的顺序并且适当地嵌套表达式 – DanielKO

回答

0

一个二元运算符需要两个(二进制)参数(如函数can),所以表达式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++中,有一个小小的期望,即程序员有智慧,而不是编译器。这样就可以让程序员更明确地控制代码的行为。

+0

隐藏OP缺乏智能并不具有建设性。另外,你的代码('fmod(a * b,c + d/ef)')不会像原始的那样评估表达式a * b%c + d/ef'),因为'%'的优先级高于加法。谁现在缺乏智能? – DanielKO

+0

@DanielKO很难仅根据他们的写作方式和内容来告诉任何人的智慧,而我试图解决我在解释他们时的误解,我只在这里回答这个问题,侮辱在哪里请尽量明确。 – Leonardo