请告诉我如何通过关联性和优先级来解决它:
#include<stdio.h>
int main()
{
int i=-3,j=2,k=0,m;
m=++i||+j&&++k;
printf("%d %d %d %d",i,j,k,m);
return 0;
}
答案 0 :(得分:1)
答案 1 :(得分:1)
||
和&&
强制从左到右操作。在评估RHS之前,两者都要充分评估其LHS操作数并应用任何副作用。两个短路;如果可以从LHS确定表达式的结果,则根本不评估RHS。
对于||
,如果LHS评估为非零值,则不评估RHS(true OR x
始终为true
)。
对于&&
,如果LHS评估为零值,则不评估RHS(false AND x
始终为false
)。
&&
的优先级高于||
,其优先级高于赋值,因此表达式已解析为
m = (++i || (++j && ++k ))
和评估如下:
++i
(||
强制从左到右评估)并应用递增i
的副作用; i
最初为-3
,++i
评估为-2
; ++i
计算结果为非零值,因此根本不评估RHS表达式++j && ++k
1 ; ||
或&&
的操作结果是布尔值(0
或1
) - 因为++i
非零, ++i || ++j && ++k
评估为1; 1
已分配给m
。因此,当所有这一切都完成时,以下情况属实:
i == -2
j == 2 // unchanged
k == 0 // unchanged
m == 1
<小时/> 1。如果
++i
已评估为0
,那么++j && ++k
将首先评估++j
,如果结果非零,则评估++k
。