(4> y> 1)是C ++中的有效语句吗?如果是这样,你如何评价?

时间:2012-01-17 04:08:31

标签: c++ if-statement conditional boolean-logic logical-operators

这是一个有效的表达吗?如果是这样,你能改写它以使它更有意义吗?例如,它与(4 > y && y > 1)相同吗?您如何评估链式逻辑运算符?

5 个答案:

答案 0 :(得分:20)

语句(4 > y > 1)被解析为:

((4 > y) > 1)

比较运算符<> evaluate left-to-right

4 > y会返回01,具体取决于是否属实。

然后将结果与1进行比较。

在这种情况下,由于01永远不会超过1,因此整个语句将始终返回false


但有一个例外:

如果y是一个类,并且>运算符已经过载以执行某些异常操作。什么都行。

例如,这将无法编译:

class mytype{
};

mytype operator>(int x,const mytype &y){
    return mytype();
}

int main(){

    mytype y;

    cout << (4 > y > 1) << endl;

    return 0;
}

答案 1 :(得分:6)

表达有效性

是的,它是一个有效的表达式,假设y是,或者可以隐式转换为整数。如果不是,并且>运算符超载,那么这个问题的范围就不同了。

它将从左到右评估为((4 > y) > 1)

假设y是一个整数,让我们考虑两种可能性。 4 > y可以返回truefalse。下一部分实际上变为true > 1false > 1

鉴于隐含的bool to int conversion,有两种可能性: A)4 > y返回truetrue评估为11 > 1评估为false。 B)4 > y返回falsefalse评估为00 > 1评估为假。

无论如何,表达式将评估为false。

重写解释

我假设你想要的是((4 > y) && (y > 1))

示例

(4 > y > 1)(4 > y && y > 1)不同。

逻辑运算符

逻辑运算符(!&&||)使用短路逻辑。

鉴于a && b,将评估a。如果a的计算结果为true,则会评估b否则,b将不会被评估。对于a || b,短路逻辑反向工作。将评估a。由于首先计算表达式a,如果它为假,则整个表达式不可能评估为真。

鉴于a || b,将评估a。如果a评估为false,则会评估b否则,b将不会被评估。由于首先计算表达式a,如果为真,则整个表达式不可能评估为假。

链接运营商是operator precedence的问题。最好使用括号并明确而不是冒错误行为。

答案 2 :(得分:4)

我认为这是一个有效的表达(不是声明),但可能不会做你想要的。它从左到右评估为(4 > y) > 1。测试4 > y将评估为0(假)或1(真),整个表达式将始终评估为0(假)。

答案 3 :(得分:2)

4&gt; y将评估为布尔值true或false。那么表达式的其余部分基本上是[true | false]&gt; 1,这没有意义。

答案 4 :(得分:-1)

4&gt; y&gt; 1 - &gt;如果你是 - 是班级,可能是任何人!

 #include <iostream>
 #include <string>

 struct num{ int n; };

 struct op{ bool v; struct num n; };

 struct op  operator > (int x, num n){
  struct op o = { x > n.n, n };
  return o;
 }
 bool operator > (struct op o, int x)
{
    return o.v && o.n.n > x;
}

int main()
{


    struct num y = { 2 } ;
    if (  4 > y > 1 ) {  std::cout << "4 > y > 1 TRUE" << std::endl; }
    else { std::cout << "4 > y > 1  ALWAYS FALSE" << std::endl; }
}