我已经知道逻辑运算符可以保证他们的评估是从左到右,但我想知道比较运算符的评估顺序是什么。例如,char *ptr = (char *)&hdr->type;
//For syn
struct syn *syn1 = (struct syn *)ptr
//For ack
struct ack *ack1 = (struct ack *)ptr
换句话说,它保证expression1 < expression2
将在expression1
之前首先进行评估。
答案 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)
不,规范不为关系运算符的操作数提及评估顺序。它没有具体说明。