有以下程序 main() { int i=1, j=2,k=3; if(i++ == l && (++j==3|| k++==3)) printf("%d %d %d\n",i,j,k);

admin2009-01-15  18

问题 有以下程序    main()    {      int  i=1,  j=2,k=3;      if(i++ ==  l  &&  (++j==3|| k++==3))        printf("%d  %d  %d\n",i,j,k);        程序运行后的输出结果是

选项 A、1  2  3
B、2  3  4
C、2  2  3
D、2  3  3

答案8

解析 在计算由&&或‖组成的逻辑表达式时一定要注意“短路”现象:&&是逻辑与,要两边的运算分量同时为真的时候表达式的值才为真,否则为假,若&&左边的运算分量为假的时候,无论&&右边的运算分量如何,整个&&表达式的结果都为假,因此C语言会忽略&&右边的表达式;‖(逻辑或)也有同样现象,当‖左边为真时将忽略右边的表达式。本题的关键点在于逻辑表达式 i++==1&&(++j)==3‖k++==3的计算。因为‖的优先级最低,  所以先计算‖左边的于表达式i++==1&&(++j)==3,  而该表达式中&&的优先级最低,所以先计算i++==1,==的优先级低于++,所以最先计算的表达式为i++,该表达式的值为i自增之前的值1,因此子表达式i++==1等价于1==1结果为“真”,此时的&&运算没有被“短路”继续运算右边的(++j)==3子表达式,因为表达式(++j)的值为6自增之后的值3,所以子表达式(++j)==3等价于3==3结果还是“真”。  “真”&&“真”的结果为“真”,即‖运算符的左边运算分量为“真”!注意,此时满足了“短路”的条件,C语言将忽略||右边的表达式,而将整个i++==1&&(++j)==3‖k++==3表达式的结果判定为“真”,子表达式k++==3没有被计算,即变量k没有自增!而i和j在前面均有得到自增1的机会,所以,4个选项中选项D符合题意。
转载请注明原文地址:https://jikaoti.com/ti/ysS0FFFM
0

相关试题推荐
最新回复(0)