邏輯運算符的混合運算

下面說說邏輯運算符的混合運算:
1、x=y=z=0;
c=++x||++y&&++z;
printf("x=%d,y=%d,z=%d",x,y,z);
結果:x=1,y=0,z=0
解釋:由於第一個是“或”運算符,當++x爲1時,它具有短路特性,屏蔽掉後面的運算符。
2、x=y=z=0;
c=(++x||++y)&&++z;
printf("x=%d,y=%d,z=%d",x,y,z);
結果:x=1,y=0,z=1
解釋:由於在c的左邊的邏輯表達式中的第一項含有“()”,所以(++x||++y)作爲一個整體——作爲一個數,所以先算括號裏面的,然後由於“&&”的運算符的特性,再算++z,而對於括號裏的再由於“||”的短路特性,只算了“++x”,由於它爲“1”,所以“++y”就被屏蔽了。
3、x=y=0
c=x&&++y||++z;
結果:c=1,x=0,y=0,z=1
解釋:注意邏輯運算符的運算順序是自左向右,所以對於左邊第一個“&&”運算符,首先算出它的邏輯值,再和後面的“||”運算,作爲c的結果。根據優先級的順序和“&&”的短路特性,由於開始x=0,則整個“&&”的邏輯表達式的邏輯值就是0,而且++y也被屏蔽掉了,再由於後面的“||”的特性,根據++z,可知c=1,z=1。
4、x=y=z=0;
c=x||++y&&z;
結果:c=0,x=0,y=1,z=0
解釋:如果“||”前爲“ 1”,則整個表達式即c=1;若“||”
前爲“0”時,那麼根據“||”的特性,該表達式的值由後面的邏輯值確定。對於後面的邏輯表達式,根據“&&”的特性,由於++y=1而z=0,可知c=0,y=1。
5、x=y=z=0;
c=x||++y&&++z;
結果:c=1,x=0,y=1,z=1
解釋:結合上一題可知,由於x=0,則該表達式的值由後面的表達式確定,根據“&&”的特性,由於“++y”的值爲“ 1”,則繼續再算“&&”後面的“++z”,由於“++z”的值也爲“1”,所以c=1,y=1,z=1。
6、x=y=z=0;
c=x&&++y&&++z;
結果:c=0,x=0,y=0,z=0
解釋:首先根據運算符的優先級,運算從左至右,對於第一個“&&”,由於x=0,則這個邏輯運算符的邏輯值爲“0”,且屏蔽了後面的“++y”。再於邏輯運算符的邏輯值爲“0”且後面爲“&&”,根據它的短路特性後面的“++z”被屏蔽了。所以整個表達式的值即c=0,x=0,y=0,z=0。
最後,總結一下關於類似c=++x&&++y||++z這類任何形式的邏輯表達試,均相當於c=(++x&&++y)||++z,但同時要結合其“&&”、和“||”不同的短路特性以及其內部的短路特性,可以正確地算出其邏輯值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章