这是一个有效的表达吗?如果是这样,你能改写它以使它更有意义吗?例如,它与(4 > y && y > 1)
相同吗?您如何评估链式逻辑运算符?
答案 0 :(得分:20)
语句(4 > y > 1)
被解析为:
((4 > y) > 1)
比较运算符<
和>
evaluate left-to-right。
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;
}
答案 1 :(得分:6)
表达有效性
是的,它是一个有效的表达式,假设y是,或者可以隐式转换为整数。如果不是,并且>
运算符超载,那么这个问题的范围就不同了。
它将从左到右评估为((4 > y) > 1)
。
假设y
是一个整数,让我们考虑两种可能性。 4 > y
可以返回true
或false
。下一部分实际上变为true > 1
或false > 1
。
鉴于隐含的bool to int conversion,有两种可能性:
A)4 > y
返回true
。 true
评估为1
。 1 > 1
评估为false。
B)4 > y
返回false
。 false
评估为0
。 0 > 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; }
}