繁体   English   中英

比较运算符的评估顺序?

[英]order of evaluation of comparison operator?

我了解到逻辑运算符可以保证从左到右进行评估,但是我想知道比较运算符的评估顺序是什么。 换句话说,例如expression1 < expression2可以确保在expression1之前先对expression2进行求值。

根据标准:

J.1未指明的行为

未指定以下内容:
....

—除了为函数调用()&&||指定的子表达式的计算顺序和副作用发生的顺序 ?:和逗号运算符(6.5)。

一般来说,表达式中子表达式的求值顺序是不确定的。

唯一有顺序(即顺序点)的地方是|| (逻辑OR) && (逻辑与) , (逗号),和?: (三元)运算符。

&&的情况下,如果左侧的表达式的计算结果为false(即0),则已知结果为false,并且不对右侧的结果求值。 对于||同样 如果左侧的表达式求值为true(即不为0),则结果为true,而右侧的表达式不求值。

对于三元运算符,首先评估条件。 如果评估结果为true,则仅评估中间部分,否则仅评估第三部分。

对于逗号运算符,首先评估左侧,然后评估右侧。

C标准

6.5.13.4与按位二进制&运算符不同,&&运算符保证从左到右的求值; 在第一个操作数求值之后有一个序列点。 如果第一个操作数比较等于0,则不评估第二个操作数。

...

6.5.14.4与按位| 运算符,|| 运营商保证从左到右的评估; 在第一个操作数求值之后有一个序列点。 如果第一个操作数比较不等于0,则不计算第二个操作数。

...

6.5.15.4计算第一个操作数; 评估后有一个序列点。 仅当第一个操作数不等于0时,才对第二个操作数求值; 仅当第一个操作数等于0时,才计算第三个操作数; 结果是第二个或第三个操作数的值(以所评估的为准),转换为以下所述的类型。 如果试图修改条件运算符的结果或在下一个序列点之后访问它,则行为是不确定的。

....

6.5.17.2逗号运算符的左操作数被评估为void表达式; 评估后有一个序列点。 然后评估正确的操作数; 结果具有其类型和价值。 如果试图修改逗号运算符的结果或在下一个序列点之后访问它,则行为是不确定的。

不,该规范提及关系运算符的操作数的评估顺序 未指定。

只需补充一下, 关系运算符是从左到右的关联

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM