1.题目:
设有以下程序段:
int x=2,y=2,z=0,a;
a=++x || ++y && z++;
printf("%d,%d,%d\n",x,y,z);
执行后输出的结果是 ?
2.代码+分析:
//设有以下程序段:
/*int x = 2, y = 2, z = 0, a;
a = ++x | ++y&&z++;
printf("%d,%d,%d\n", x, y, z)
执行后输出的结果是? */
int x = 2, y = 2, z = 0, a;
a = ++x || ++y && z++;
printf("%d,%d,%d\n", x, y, z);
//分析:根据优先级口诀,++排第二,&&十一,||十二
//所以 : ++x=3,++y=3(未执行),z++=0(未执行)
//然后: ++y && z++ =3 && 0=0(未执行)
//接着: 3 || 0=1,但是因为||前面为真发生短路现象后面都不执行
//输出x=3,y=2,z=0
//此时我们再从新捋一遍顺序,逻辑或的短路现象比优先级高,一旦短路后面优先级都不再考虑和执行
/*++x 递增了 x 的值,所以 x 变成了3。
然后,整个表达式 a = ++x || ++y && z++; 中的左侧操作数 ++x 的结果为非零,因此不再计算右侧的操作数
++y 没有执行,所以 y 仍然为2。
z++ 也没有执行,因此 z 仍然为0*/
}
3.注意:
||
:逻辑或运算符,如果左边的操作数为真(非零),则不再计算右边的操作数。在这种情况下,++x
的结果是非零,因此不再执行右侧的表达式。- 短路现象比运算符优先级级别高,一旦短路优先级不再执行。短路现象是指当使用逻辑运算符(如逻辑与
&&
和逻辑或||
)时,如果左侧的操作数已经确定了整个表达式的结果,那么右侧的操作数将不会被计算。这是为了提高运行时的效率,并避免不必要的计算。 - 无论运算符的优先级如何,如果出现短路现象,左侧操作数的结果将决定整个表达式的值。
- 短路现象可以使左侧操作数的结果在考虑运算符的优先级之前确定整个表达式的结果。这对于逻辑运算非常重要,因为它可以防止在某些情况下执行不必要的操作,从而提高程序的效率