比较运算符的评估顺序?

时间:2016-08-04 14:44:16

标签: c

我已经知道逻辑运算符可以保证他们的评估是从左到右,但我想知道比较运算符的评估顺序是什么。例如,char *ptr = (char *)&hdr->type; //For syn struct syn *syn1 = (struct syn *)ptr //For ack struct ack *ack1 = (struct ack *)ptr 换句话说,它保证expression1 < expression2将在expression1之前首先进行评估。

3 个答案:

答案 0 :(得分:3)

根据标准:

  

J.1未指明的行为

     

以下未指明:
....

     

- 评估子表达式的顺序以及副作用的顺序   发生,除了为函数调用()&&||?:和逗号指定的内容   运营商(6.5)。

答案 1 :(得分:1)

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

唯一存在订单的地方,即序列点,是TextControlThemeMinHeight(逻辑OR),||(逻辑AND),&&(逗号)和{{ 1}}(三元)运算符。

,的情况下,如果左边的表达式评估为假(即0),则结果已知为假,并且不评估右侧。类似地,对于?:,如果左边的表达式求值为true(即不为0),则结果已知为真,并且未评估右侧。

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

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

来自C standard

  

6.5.13.4与按位二进制和&amp;操作员,&amp;&amp;运营商保证从左到右的评估;有一个序列点   在评估第一个操作数之后。如果是第一个   操作数比较等于0,不计算第二个操作数。

     

...

     

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

     

...

     

6.5.15.4评估第一个操作数;评估后有一个序列点。仅当第二个操作数被评估时才会被评估   首先比较不等于0;第三个操作数仅在以下情况下进行评估   第一个比较等于0;结果是第二个的值   或第三个操作数(以评估者为准),转换为该类型   如下面所描述的。如果尝试修改a的结果   条件运算符或在下一个序列点之后访问它,   行为未定义。

     

...

     

6.5.17.2逗号运算符的左操作数被计算为void表达式;它之后有一个序列点   评价。然后评估右操作数;结果有它   类型和价值。如果尝试修改逗号的结果   运算符或在下一个序列点之后访问它的行为   未定义。

答案 2 :(得分:0)

不,规范为关系运算符的操作数提及评估顺序。它没有具体说明。

添加relational operators are left-to-right associative