是(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,这是没有意义的。