是(4> y> 1)在C ++中有效的语句? 你如何评价呢?

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

语句(4 > y > 1)被parsing为:

 ((4 > y) > 1) 

比较运算符<> 从左到右评估 。

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

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

expression有效性

是的,这是一个有效的expression式,假设y是或可以隐式转换为整数。 如果不是,运算符超载,这个问题的范围之外的情况是不同的。

((4 > y) > 1)从左到右进行评估。

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

给定隐式布尔到int的转换 ,有两种可能性:A) 4 > y返回truetrue评估为11 > 1评估为错误。 B) 4 > y返回falsefalse评估为00 > 1评估为错误。

无论如何,这个expression方式会被评估为错误的。

重写的解释

我假设你打算((4 > y) && (y > 1))

(4 > y > 1)不等于(4 > y && y > 1)

逻辑运算符

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

给定a && ba将被评估。 如果a评估为真,则b将被评估。 否则, b将不会被评估 。 至于a || b a || b ,短路逻辑反向工作。 a将被评估。 由于expression式a首先被评估,如果它是假的,整个expression式不可能评估为真。

给定a || b a || ba将被评估。 如果评估结果为false,则将评估b否则, b将不会被评估 。 由于首先评估expression式a ,如果是,那么整个expression式就不可能评估为假。

链接运营商是运营商的优先事项。 最好使用括号,而不要冒错误行为的风险。

4> y将评估为true或false的布尔值。 expression式的其余部分基本上是[true | false]> 1,这是没有意义的。