奇怪的条件格式
Weird conditional format
在我无尽的旅程中,在这个美丽的东西,也被称为The Internet
的巨大而危险的平面上,我遇到了一个神秘的、老的、白胡子的巫师,他的名字不能提。尽管他非常强大,但死亡很快就把他带走了。
临终前他递给我一卷书,昏倒时低声说
Take this and spread the knowledge
在他死后,他的身体迅速转化为能量,纯净的能量在宇宙中传播。
卷轴包含这段代码:
#include <iostream>
int main()
{
int x = 3;
while(2 <= x <= 5)
std::cout << x++;
}
这个谜直到今天仍然存在:
条件如何求值?
总是为true,因为2<=x
要么计算为1
要么计算为0
,两者都是<=5
。
这实际上是一个无限循环:
while( (2 <= x) <= 5)
std::cout<<x++;
这个卷轴的作者想要表达一个条件,我们称之为链式运算符符号,这在数学中是众所周知的(也许向导是个数学家?):
Let x ∈ ℜ, 2 ≤ x ≤ 5. Then ...
通常,这在c++、C、Java和许多其他具有类似表达式求值逻辑的语言中是不可能的。有一些库支持这样的特性,但另一方面引入了冗长,因为您必须首先包装一个参数。而且,对于程序员来说,它不是很好读。
如果您使用向导在此卷轴上所使用的语言编写表达式,则将从左到右对进行计算:
while ( (2 <= x) <= 5 )
...
总是true
,因为2 <= x
要么是true
,要么是false
,并且分别隐式转换为1
或0
的整型值,这两个值总是小于或等于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)
,从而简化了自定义类型的实现。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在没有太多条件句的情况下,我如何避免被零除
- 如何在openssl-ecc中获取十六进制格式的私钥
- 基于多个条件处理地图中的所有元素
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 条件constexpr函数
- 无论条件是否为true,if总是在c++中执行
- TDateTime格式在C++Builder中不会更改
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 基于模板值的条件变量
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- C++:根据int值的基数使用条件格式打印
- 在语句中设置条件检查格式"if"最佳方法
- Astyle-如何将不带大括号的条件格式化为1TBS
- 奇怪的条件格式