2013-01-15 113 views
1

在我漫长的无尽的旅程中,这个美丽的东西也被称为The Internet,我遇到了一个神秘的,老的,白胡子的巫师,他的名字不会被提及。尽管非常强大的死亡迅速将他带走。他把他的最后一口气之前奇怪的条件格式

时刻,他递给我一个卷轴,虽然他死后,他的身体转化为能量,纯净的能量,传播宇宙中后昏厥远低声

Take this and spread the knowledge

迅速。

滚动包含这段代码:

#include <iostream> 
int main() 
{ 
    int x = 3; 
    while(2 <= x <= 5) 
     std::cout << x++; 
} 

奥秘仍然是这一天:

怎样的条件评价?

+1

考虑到他那么古老,他可能学会了写在CPL或BCPL中,那里的条件表现如同数学声明 –

+0

对于近亲选民:这怎么不是一个“真正的问题”? - “这个问题含糊不清,含糊不清,不完整,过于宽泛,或是修辞性的,不能以目前的形式合理回答。” - 这是真的吗? //创造力+1。 – leemes

回答

5

那么,这个滚动的作曲家想要表达我们称之为条件链运营符号,从数学众所周知的(也许向导是个数学家? ):

Let x ∈ ℜ, 2 ≤ x ≤ 5. Then ... 

通常,这是不可能的C++,C,Java和很多具有类似表达评估逻辑其它语言。有一些库启用了这样的功能,但另一方面却引入了冗长的功能,因为您必须首先打包其中一个参数。另外,它对于程序员来说不是很可读。

如果你写在为向导在此滚动做了这样的语言表达,它就会从左至右评估

while ((2 <= x) <= 5) 
    ... 

这始终是true,因为2 <= x要么truefalse并隐含地分别转换为10的整数值,该值始终小于或等于5

要表达的条件作为数学家希望它是,你必须使用语法

while ((2 <= x) && (x <= 5)) 
    ... 

或使用效用函数来表示正是这一点:

template<class T> 
bool between(const T& arg, const T& min, const T& max) { 
    return !(arg < min) && !(max < arg); 
} 


while (between(x, 2, 5)) 
    ... 

注意我怎么写between中的条件:它只需要执行operator<(T, T),简化了自定义类型的实现。

13

总是为真,因为2<=x计算结果为10,这两者都是<=5

所以这是有效的无限循环:

while((2 <= x) <= 5) 
    std::cout<<x++;