是(4> y> 1)在C ++中有效的语句? 你如何评价呢?
这是一个有效的expression? 如果是这样,你可以重写它,使它更有意义吗? 例如,是否与(4 > y && y > 1) ? 你如何评估链式逻辑运算符?
语句(4 > y > 1)被parsing为:
((4 > y) > 1)
比较运算符<和> 从左到右评估 。
4 > y根据是否为真返回0或1 。
然后将结果与1进行比较。
在这种情况下,由于0或1永远不会超过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可以返回true或false 。 下一部分有效地变为true > 1或false > 1 。
给定隐式布尔到int的转换 ,有两种可能性:A) 4 > y返回true 。 true评估为1 。 1 > 1评估为错误。 B) 4 > y返回false 。 false评估为0 。 0 > 1评估为错误。
无论如何,这个expression方式会被评估为错误的。
重写的解释
我假设你打算((4 > y) && (y > 1)) 。
例
(4 > y > 1)不等于(4 > y && y > 1) 。
逻辑运算符
逻辑运算符( ! , && , || )使用短路逻辑。
给定a && b , a将被评估。 如果a评估为真,则b将被评估。 否则, b将不会被评估 。 至于a || b a || b ,短路逻辑反向工作。 a将被评估。 由于expression式a首先被评估,如果它是假的,整个expression式不可能评估为真。
给定a || b a || b , a将被评估。 如果评估结果为false,则将评估b 。 否则, b将不会被评估 。 由于首先评估expression式a ,如果是,那么整个expression式就不可能评估为假。
链接运营商是运营商的优先事项。 最好使用括号,而不要冒错误行为的风险。
4> y将评估为true或false的布尔值。 expression式的其余部分基本上是[true | false]> 1,这是没有意义的。