(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 > 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;
【讨论】:
从技术上讲,4 > y
返回 false
或 true
,它们将转换为 0
或 1
以进行下一次比较。
我将解析标记为 operator>(operator>(4, y), 1)
以强调它是二进制函数的重复应用,而不是某种 n 元函数
C++ 需要更强的类型。隐式类型转换会导致如此细微的错误。【参考方案2】:
表达式有效性
是的,它是一个有效的表达式,假设 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
评估为假。
B)4 > y
返回false
。 false
计算结果为 0
。 0 > 1
计算结果为假。
无论如何,表达式的计算结果都会为 false。
重写的解释
我假设你想要的是((4 > y) && (y > 1))
。
示例
(4 > y > 1)
与(4 > y && y > 1)
不同。
逻辑运算符
逻辑运算符(!
、&&
、||
)使用短路逻辑。
给定a && b
,a
将被评估。如果a
评估为真,那么b
将被评估。 否则,b
将不会被评估。至于a || b
,短路逻辑反向工作。 a
将被评估。由于表达式a
首先被求值,如果它为假,则整个表达式都不可能求值为真。
给定a || b
,将评估a
。如果 a
评估为 false,则将评估 b
。 否则,b
将不会被评估。由于表达式a
首先被求值,如果为真,则整个表达式都不可能求值为假。
链接运算符是operator precedence 的问题。最好使用括号并清楚,而不是冒错误行为的风险。
【讨论】:
【参考方案3】:我认为这是一个有效的表达式(不是一个语句),但可能不会做你想要的。它从左到右评估,如(4 > y) > 1
。测试 4 > y
将评估为 0 (false) 或 1 (true),整个表达式将始终评估为 0 (false)。
【讨论】:
【参考方案4】:4 > y 将评估为 true 或 false 的布尔值。那么表达式的其余部分本质上是 [true|false] > 1,这是没有意义的。
【讨论】:
当您意识到true
和 false
在 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++ 中的有效语句吗?如果是,你如何评价?的主要内容,如果未能解决你的问题,请参考以下文章