将此表达式视为整数“x”上的“选择”控制结构: 0< x< 10, 如果“x”在1..9范围内,则结构返回TRUE。
答案 0 :(得分:2)
表达式不像二进制操作那样读取,但类似于三元运算符。你所陈述的有3个参数,0< x< 10,因为0,x和10都是解析器解释的标记,不是吗?如果你的意思是一对<形成一个不同故事的三元运算符。
可以将三元运算视为分成一对比较,并且每个比较都是通过AND运算合并得到的。这是有道理的 在我看来。
答案 1 :(得分:1)
考虑<的返回类型。操作
答案 2 :(得分:0)
我认为这个神秘的编译器无法将该表达式转换为:
x > 0 && x < 10
答案 3 :(得分:0)
代码在C和C ++中在语法上是有效的,但在任何一种语言中都是unlikley在语义上是正确的。我们此时正在猜测这种语言。
当我将其编译为C ++时,VC ++ 2008发出了一个警告而不是给出了答案,所以你可以尝试一下。这是我的测试代码:
int main()
{
volatile int x = 0 ;
if( x < x < 10 )
{
x = 5 ;
}
}
当使用C编译时,它会默默地接受它。
为什么它可能是一个问题,编译器将表达式解释为(0&lt; x)&lt; 10.提示:第二个“&lt;”左侧的类型是什么? ?
然而,这可能不是您正在寻找的答案,因为如果编译器不接受它,您似乎必须引用不同的语言。
答案 4 :(得分:0)
C ++很满意。你甚至可以给它正确的语义:
#include <iostream>
#include <cstdlib>
#include <cassert>
using namespace std;
class Int
{
public:
int x;
Int () { }
Int (int z) : x (z) { }
};
class BoolRange
{
public:
bool value;
int left;
int right;
BoolRange() : value (false) { }
BoolRange (bool v, int l, int r)
: value (v), left (l), right (r) { }
operator bool ()
{
return value;
}
};
ostream& operator<< (ostream& out, Int i)
{
return out << i.x;
}
ostream& operator<< (ostream& out, BoolRange b)
{
return out << b.left << '[' << b.value << ']' << b.right;
}
BoolRange operator< (Int l, Int r)
{
return BoolRange (l.x < r.x, l.x, r.x);
}
BoolRange operator< (Int l, BoolRange r)
{
return r.value
? BoolRange (l.x < r.left, l.x, r.right)
: BoolRange ();
}
BoolRange operator< (BoolRange l, Int r)
{
return l.value
? BoolRange (l.right < r.x, l.left, r.x)
: BoolRange ();
}
BoolRange operator< (BoolRange l, BoolRange r)
{
return l.value && r.value
? BoolRange (l.right < r.left, l.left, r.right)
: BoolRange ();
}
// Test driven development!
int main ()
{
for (int i = 0; i < 1000000; ++i)
{
Int v = rand() % 100;
Int w = rand() % 100;
if (Int(1) < v < w < Int(10)) // Look here!
{
assert (1<v.x && v.x<w.x && w.x<10);
} else
{
assert (1>=v.x || v.x>=w.x || w.x>=10);
}
}
}