標籤:
關於a=0和a==0的解釋:
如果:int a = 0;
那麼a=0這個運算式是假,a==0這個運算式為真。
如果:int a = 1;
那麼a=0這個運算式是假,a==0這個運算式為假。
舉個例子:
int a = 0; if( a = 0 ) printf( "True" ); else printf( "False" );
輸出:False.
<span style="font-size:18px;"> </span><span style="font-size:10px;">int a = 0; if( a == 0 ) printf( "True" ); else printf( "False" );</span>
輸出:True.
int a = 1; if( a == 0 ) printf( "True" ); else printf( "False" );
輸出:False
int a = 0; if( a = 1 ) printf( "True" ); else printf( "False" );
輸出:True
結合C語言優先順序以及結合性來看一個例子:
int main(){ int a,b,c; a=b=c=0; (1>0?a==0:0>1)?b++:c++; printf( "%d%d%d\n", a, b, c ); return 0;}輸出結果是:010.
int main(){ int a,b,c; a=b=c=0; (1>0?a=0:0>1)?b++:c++; printf( "%d%d%d\n", a, b, c ); return 0;}輸出結果則是:001
int main(){ int a,b,c; a=b=c=0; 1>0?a++:(0>1?b++:c++); printf( "%d%d%d\n", a, b, c ); return 0;}輸出結果是:100.很奇怪的是b和c的值都沒有改變。在C語言中,條件運算式?:的結合性是右結合的(就是從右往左結合)。也就是說跟下面這個程式一樣:
int main(){ int a,b,c; a=b=c=0; 1>0?a++:0>1?b++:c++; printf( "%d%d%d\n", a, b, c ); return 0;}去掉了括弧。輸出結果經過驗證確實是一樣的:100。
那麼,這個括弧()的優先順序是比條件運算式的優先順序高很多的。所以應該先計算(0>1?b++:c++)這個吧?不是嗎?
如果是,那麼0>1為假,則執行c++,所以c=1;
如果不是,那麼先把後面那個括弧(0>1?b++:c++)當做是前面?:語句的一個子項。那麼就是先判斷1>0為真,所以執行a++,a=1;答案輸出100.正確!
到底是不是這樣子的呢??我們再來驗證:
int main(){ int a,b,c; a=b=c=0; 0>1?a++:(0>1?b++:c++); printf( "%d%d%d\n", a, b, c ); return 0;}輸出結果是:001.分析一下,先判斷0>1為假,所以執行(0>1?b++:c++),判斷,0>1為假所以執行c++,c=1;輸出001,所以驗證了假說。
目前應該是這樣的。
再看一個例子:
int main(){ int a,b,c; a=b=c=0; 0>1?a++:0>1?b++:c++?1>0?b++:c++:a++; printf( "%d%d%d\n", a, b, c ); return 0;}
輸出結果是:101.
C Language Study - a=0 and a==0