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

tru*_*ktr 13 c++ conditional boolean-logic if-statement logical-operators

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

Mys*_*ial 22

该语句(4 > y > 1)被解析为:

((4 > y) > 1)
Run Code Online (Sandbox Code Playgroud)

比较运算符<> 从左到右进行评估.

4 > y返回或者0还是1取决于如果它是真的还是假的.

然后将结果与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;
}
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,`4> y`返回`false`或`true`,它们被转换为'0`或`1`以进行下一次比较. (6认同)

Sio*_*vok 7

表达有效性

是的,它是一个有效的表达式,假设y是,或者可以隐式转换为整数.如果不是,并且>操作员超负荷,那么这个问题范围之外的情况就不同了.

它将从左到右进行评估((4 > y) > 1).

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

给定隐式bool到int转换,有两种可能性:A)4 > y返回true.true评估为1.1 > 1评估为假.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首先计算表达式,如果表达式为false,则整个表达式不可能评估为true.

鉴于a || b,a将予以评估.如果a计算结果为false,b则将进行评估.否则,b将不予评估.由于a首先计算表达式,如果为真,则整个表达式不可能评估为false.

链接运算符是运算符优先级的问题.最好使用括号并明确而不是冒错误行为.