1、有int a=3,b=4,c=5;則表達式a||b+c&&b==c的值為(1),為什么?2、以下程序運行結果為(1、0)?main(){int x,y,z;x=1;y=1;z=0;x=x||y&&z;printf("%d,%d",x,x&&!y||z);}
熱心網友
樓上幾位的說法都是有錯的。main(){int a=3,b=2,c=1;int i;i=a||b++&&c++; /*為了說明一個問題我改了表達式,但是與原來表達式還是差不多的。*/printf("i=%d",i);printf("\n b=%d,c=%d",b,c);}看看b,c輸出的值,還是2,1,就是說a||的后面實際上沒有運算。在C語言有這樣的一個例子,a||b,a如果是1(即大于0為真)的話,1或任何數都為1,所以后面是就不運算了(如果a為假,后面就要運算)。a&&b,與里面也有一個相同的,如果a為0,0與任何數都為0,所以這種情況下與的右邊也不運算。就像上面的的例子i=a||b++&&C++; 又如 i=a||(b=b+7)||(a=a+4);輸出a和b看看值,就知道后面沒運算。所以0(即表達式值為假)&&任何值/表達式都為0,1(即表達式值為真)||任何表達式/值都為1,這個在運算表達式里就注意有這兩個情況,因為它后面不運算的。C語言表達式的題很喜歡出這類的,因為在這道題從表面上從優先級考慮你肯定要把所有的表達計算。說了這么多,來看你的第二題,其實第二題也是有這種情況的。main(){int x,y,z;x=1;y=1;z=0;x=x||y&&z; /*這里x=1,x為真,像前面說或的一種情況。||的右邊就不會運 算(當然在這道題即使后面運算也不會影響這里的結果,但是 要清楚TC到底是在做什么,結果一樣,但想法是不正確的*/printf("%d,%d",x,x&&!y||z);/*這里,x為真,如前面所說,如果x為0即為條 件假的情況后面是不運算,肯定為假了。這里 x為真,整個運算就要進行上。!y=0,!的運算級高先運算,然后它與X&&,得0,0與Z||自然就得0,結果為0。注意如果與Z之前與X&&得的是1即真的話(即初始化改y的值為0,!y就為1(真)),那么用前面的說過的情況1(真)||任何值或表達式都為真,||后面不會運算。 }。
熱心網友
樓上的朋友,就第一題來說,我認為應該先算b+c,因為算術運算符的級別高,你說呢?
熱心網友
1.當然是等于1了,注意這里的1表示"是",如果出現0表示"否",因為這個是邏輯運算符號,我們來分析一下吧.&&表示邏輯和,就是&&左右兩邊的表達式都要成立才是"1",那你看b=4,c=5,顯然b不會等于c,所以顯然右邊的(c&&b==c)這個表達式的值是0.再來看a||b,表示a或者b,這樣計算結果是1,所以整個式子的值就是1+0=1,所以是1啊.2.我們繼續分析,有了上面題目的經驗我們可以很快知道x||y&&z一定是1,然后把1的值賦予x,所以x就是1,所以第一個1是這樣來的.關于第二個0,由于!的優先級別要大于||,,!y=0,!y||z這個表達式就是0了,由于x是1,!y||z是0,進行合并運算&&兩邊表達式結果不一樣所以結果自然就是0了.第一次在網絡上分析C程序,呵呵這個題目不清楚的話再說吧.