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

Posted

技术标签:

【中文标题】(4 > y > 1) 是 C++ 中的有效语句吗?如果是,你如何评价?【英文标题】:Is (4 > y > 1) a valid statement in C++? How do you evaluate it if so? 【发布时间】:2012-02-11 22:56:10 【问题描述】:

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

【问题讨论】:

Language support for chained comparison operators (x < y < z)的可能重复 【参考方案1】:

语句(4 &gt; y &gt; 1)被解析为:

((4 > y) > 1)

比较运算符&lt;&gt; evaluate left-to-right。

4 &gt; y 返回 01 取决于它是否为真。

然后将结果与1进行比较。

在这种情况下,由于01 永远不会超过1,因此整个语句将始终返回false


不过有一个例外:

如果y 是一个类并且&gt; 运算符已被重载以执行不寻常的操作。然后一切顺利。

例如,这将无法编译:

class mytype
;

mytype operator>(int x,const mytype &y)
    return mytype();


int main()

    mytype y;

    cout << (4 > y > 1) << endl;

    return 0;

【讨论】:

从技术上讲,4 &gt; y 返回 falsetrue,它们将转换为 01 以进行下一次比较。 我将解析标记为 operator&gt;(operator&gt;(4, y), 1) 以强调它是二进制函数的重复应用,而不是某种 n 元函数 C++ 需要更强的类型。隐式类型转换会导致如此细微的错误。【参考方案2】:

表达式有效性

是的,它是一个有效的表达式,假设 y 是或可以隐式转换为整数。如果不是,并且 &gt; 运算符重载,则在此问题范围之外是另一回事。

它将从左到右评估为((4 &gt; y) &gt; 1)

假设y 是一个整数,让我们考虑两种可能性。 4 &gt; y 可以返回truefalse。下一部分实际上变成了true &gt; 1false &gt; 1

鉴于隐含的bool to int conversion,有两种可能性: A)4 &gt; y 返回truetrue 计算结果为 11 &gt; 1 评估为假。 B)4 &gt; y 返回falsefalse 计算结果为 00 &gt; 1 计算结果为假。

无论如何,表达式的计算结果都会为 false。

重写的解释

我假设你想要的是((4 &gt; y) &amp;&amp; (y &gt; 1))

示例

(4 &gt; y &gt; 1)(4 &gt; y &amp;&amp; y &gt; 1) 不同。

逻辑运算符

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

给定a &amp;&amp; ba 将被评估。如果a 评估为真,那么b 将被评估。 否则,b 将不会被评估。至于a || b,短路逻辑反向工作。 a 将被评估。由于表达式a首先被求值,如果它为假,则整个表达式都不可能求值为真。

给定a || b,将评估a。如果 a 评估为 false,则将评估 b否则,b 将不会被评估。由于表达式a首先被求值,如果为真,则整个表达式都不可能求值为假。

链接运算符是operator precedence 的问题。最好使用括号并清楚,而不是冒错误行为的风险。

【讨论】:

【参考方案3】:

我认为这是一个有效的表达式(不是一个语句),但可能不会做你想要的。它从左到右评估,如(4 &gt; y) &gt; 1。测试 4 &gt; y 将评估为 0 (false) 或 1 (true),整个表达式将始终评估为 0 (false)。

【讨论】:

【参考方案4】:

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

【讨论】:

当您意识到 truefalse 在 C/C++ 中是整数值时,这“很有意义”。 泰德:不,他们不是。不过,它们可以相互转换。 @Gman:技术性,但相关。语义可能很残酷。【参考方案5】:

4 > y > 1 --> MANYWAY 如果 y - 是类!!。

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

【讨论】:

以上是关于(4 > y > 1) 是 C++ 中的有效语句吗?如果是,你如何评价?的主要内容,如果未能解决你的问题,请参考以下文章

回形取数(蓝桥杯)c++?

使用 C++ 处理 Qt 脚本中的异常?

C++小游戏

C++ 将指针转换为指针 (x**) -> (y**)

两个C++程序

求c++中vector用法