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

Is (4 > y > 1) a valid statement in C++? How do you evaluate it if so?

提问人:trusktr 提问时间:1/17/2012 最后编辑:Niall C.trusktr 更新时间:3/10/2018 访问量:5215

问:

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

C++ IF- 条件语句 布尔逻辑 逻辑运算符

答:

2赞 user321605 1/17/2012 #1

4 > y 的计算结果为 true 或 false。然后,表达式的其余部分本质上是 [true|false] > 1,这没有意义。

评论

0赞 Ted Hopp 1/17/2012
当你意识到这一点时,它是“有意义的”,并且是 C/C++ 中的整数值。truefalse
2赞 GManNickG 1/17/2012
泰德:不,他们不是。不过,它们可以相互转换。
0赞 Sion Sheevok 1/17/2012
@Gman:一个技术性问题,但一个相关的问题。语义可能是残酷的。
24赞 Mysticial 1/17/2012 #2

该语句解析如下:(4 > y > 1)

((4 > y) > 1)

比较运算符并按从左到右计算<>

返回要么,要么取决于它是否正确。4 > y01

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

在这种情况下,由于 or 从不大于 ,整个语句将始终返回 false011


但有一个例外:

if 是一个类,并且运算符已重载以执行异常操作。然后什么都去。y>

例如,这将无法编译:

class mytype{
};

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

int main(){

    mytype y;

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

    return 0;
}

评论

9赞 fredoverflow 1/17/2012
从技术上讲,返回 或 ,这是转换为下一次比较的 or。4 > yfalsetrue01
0赞 Caleth 11/6/2018
我会给解析贴上标签,以强调它是二进制函数的重复应用,而不是某种 n 元函数operator>(operator>(4, y), 1)
0赞 Vasantha Ganesh 3/15/2021
C++ 需要更强的类型。隐式类型转换会导致这种微妙的错误。
4赞 Ted Hopp 1/17/2012 #3

我认为这是一个有效的表达式(不是语句),但可能不会做你想做的事。它从左到右计算,如 .测试的计算结果为 0 (false) 或 1 (true),整个表达式的计算结果始终为 0 (false)。(4 > y) > 14 > y

8赞 Sion Sheevok 1/17/2012 #4

表达式有效性

是的,它是一个有效的表达式,假设 y 是或可以隐式转换为整数。如果不是,并且操作员过载,则在此问题的范围之外是另一回事。>

它将从左到右计算为 。((4 > y) > 1)

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

给定隐式 bool 到 int 的转换,有两种可能性: A) 返回 . 计算结果为 。 计算结果为 false。 B) 返回 。 计算结果为 。 计算结果为 false。4 > ytruetrue11 > 14 > yfalsefalse00 > 1

无论如何,表达式的计算结果都将为 false。

重写的解释

我假设你的意图是.((4 > y) && (y > 1))

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

逻辑运算符

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

给定 ,将被评估。如果计算结果为 true,则将进行计算。否则,将不计算 b。至于,短路逻辑则相反。 将进行评估。由于表达式是首先计算的,因此如果它为 false,则整个表达式不可能计算为 true。a && baaba || baa

给定 ,将被评估。如果计算结果为 false,则将进行计算。否则,将不计算 b。由于表达式是首先计算的,因此如果它为 true,则整个表达式不可能计算为 false。a || baaba

链接运算符是运算符优先级的问题。最好使用括号并清晰,而不是冒着错误行为的风险。

-1赞 Khurshid Normuradov 1/25/2018 #5

4 > y > 1 --> MAY BE ANYWAY IF Y - IS CLASS!.

 #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; }
}