奇怪的条件格式

use*_*963 2 c++ conditional-statements

在我无休止的旅程中,围绕着这个美丽的东西的巨大而危险的飞机,The Internet我也遇到了一个神秘的,老白胡子的巫师,他的名字不会被提及.尽管死得很厉害,很快就把他带走了.

在他最后一次呼吸之前的那一刻,他向我传了一个卷轴,然后晕倒了

Take this and spread the knowledge

在他去世后很快,他的身体转化为能量,纯净的能量在宇宙中传播.

滚动包含这段代码:

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

这个谜至今仍然存在:

如何评估病情?

Luc*_*ore 13

始终为真,因为2<=x要么评估1或者0两者都是<=5.

所以这实际上是一个无限循环:

while( (2 <= x) <= 5)
    std::cout<<x++;
Run Code Online (Sandbox Code Playgroud)


lee*_*mes 5

好吧,这个卷轴的作曲家想要表达一个我们称之为链式算子符号的条件,从数学中可以知道(也许向导是数学家?):

Let x ? ?, 2 ? x ? 5. Then ...
Run Code Online (Sandbox Code Playgroud)

通常,这在C++,C,Java和许多具有类似表达式评估逻辑的其他语言中是不可能的.有些库可以实现这样的功能,但另一方面会引入冗长,因为你必须首先包装其中一个参数.此外,它对程序员来说也不是很易读.

如果您使用向导在此滚动条上执行的语言编写表达式,则将从左到右对其进行求值:

while ( (2 <= x) <= 5 )
    ...
Run Code Online (Sandbox Code Playgroud)

总是true,因为2 <= x它是true或者false隐式地转换为整数值1或者0,它总是小于或等于5.

为了表达数学家所希望的条件,你必须使用语法

while ( (2 <= x) && (x <= 5) )
    ...
Run Code Online (Sandbox Code Playgroud)

或者使用效用函数来表达:

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


while ( between(x, 2, 5) )
    ...
Run Code Online (Sandbox Code Playgroud)

请注意我是如何编写条件的between:它只需要实现operator<(T, T),简化自定义类型的实现.