C运算符优先级,增量后编程问题
有人能解释为什么程序的输出是C运算符优先级,增量后编程问题,c,operators,post-increment,operator-precedence,C,Operators,Post Increment,Operator Precedence,有人能解释为什么程序的输出是 01131 void main(void) { int i=-1,j=0,k=1,l=2,m; m=i++&&j++&&k++||l++; printf("%d %d %d %d %d",i,j,k,l,m); } 主要关注点是“为什么k不增加” 仅供参考。我正在VC++编辑器Windows 7 32位中编译该程序。 非常感谢。让我们将其分解为单独的操作: i++&&j++:这将与-1&&0
01131
void main(void)
{
int i=-1,j=0,k=1,l=2,m;
m=i++&&j++&&k++||l++;
printf("%d %d %d %d %d",i,j,k,l,m);
}
主要关注点是“为什么k不增加”
仅供参考。我正在VC++编辑器Windows 7 32位中编译该程序。
非常感谢。让我们将其分解为单独的操作:
i++&&j++
:这将与-1&&0
相同,为false(即0)i
和j
分别增加到0
和1
0&&k++
:零来自上一个逻辑运算,结果为false,因为第一个运算符为falsek
没有增加,因为逻辑运算符的快捷性质0 | | l
:零仍然来自先前的逻辑操作,它是0 | | 2
,结果将为真,即1
l
增加到3
m
,该结果现在变为真(即1
)整个表达式使
i
、j
和l
增加,而m
变为1
。只是您看到的结果。您的值的计算如下所示
m=((((i++)&&j++)&&k++)||l++);
由于all++都是增量后的,所以在计算m期间,所有变量的值都与您初始化的值相同,但在打印期间的下一行,它们都是增量。最后一行是| |,因此final TRUE将返回m的值。大致如下:
要计算i++&&j++
,编译器首先计算i
。结果是-1
<代码>-1存储在临时变量中。然后i
得到递增
因为-1
不是零,编译器计算j
,即0
。编译器现在评估-1&&0
,即0
。然后j
得到递增
此时,i=0
和j=1
。剩余表达式:m=0&&k++|l++代码>
为了计算0&&k++
,编译器注意到第一个操作数是0
。结果必须是0
,所以编译器没有计算k
或k++
。剩余表达式:m=0 | | l++代码>
我希望你能做剩下的事。:) 对于复杂表达式最好使用括号。使用括号计算表达式的方式。请参见,没有什么比void main()
更让我怀旧的了。由于逻辑运算符的快捷性质,k的可能重复数没有增加--->它是如何决定的?@PowerPC在这样一个0&&1
表达式中,结果保证是0
,因此,不需要计算&&
运算符的右侧。与1 | | 0
相同,它将始终是1
,并且发生相同的事情。这都是在C规范中指定的。感谢您的详细解释。@JoachimPileborg:+1用于解释感谢您解释为什么k不递增!