二元运算符“<”

时间:2010-05-13 21:17:34

标签: binary

将此表达式视为整数“x”上的“选择”控制结构: 0< x< 10, 如果“x”在1..9范围内,则结构返回TRUE。

  1. 解释编译器不应接受此表达式的原因。 (特别是,关于二元运算符“<”?
  2. 的问题是什么
  3. 说明如何引入前缀运算符,以便可以成功处理表达式。

5 个答案:

答案 0 :(得分:2)

  1. 表达式不像二进制操作那样读取,但类似于三元运算符。你所陈述的有3个参数,0< x< 10,因为0,x和10都是解析器解释的标记,不是吗?如果你的意思是一对<形成一个不同故事的三元运算符。

  2. 可以将三元运算视为分成一对比较,并且每个比较都是通过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);
        }
    }
}