2013-07-31 100 views
-2

爲什麼printf()在這種情況下不會調用?在這種情況下我們可以使用&&還是什麼?爲什麼我的文字不能打印?

{ 
    int zz1,zz2; 
    zz1 = 8; 
    zz2= zz1/2; 
    if ((zz1==! 0) && (zz2 ==! 1)){ 
     printf("!!!!!!!!!!"); 
    } 
} 
+5

檢查您的語法'(zz1 ==!0)'您從哪種編程語言中獲得? – karthikr

+0

@karthikr是'== ZZ 1!0' =>'== ZZ 1!0' **?** –

+0

Ç,,,,,,,,,,,,,, – user2570509

回答

1

我想你會寫(zz1 != 0) && (zz2 != 1)

其實(zz1 == !0) && (zz2 == !1)是一個有效的語法,但在這種情況下,因爲你正在編寫產生事與願違的結果:

  1. zz1 equals to (not)0 AND zz2 equals to (not)1
  2. 也就是說zz1 equals to 1 AND zz2 equals to 0
  3. 是假的,所以printf不叫
0

也許你想寫(zz1 != 0) && (zz2 != 1)

1

==!不是一個操作符,而是其實際解析爲兩個運算符==!,因爲編譯器總是選擇最長的令牌。而zz1==!0實際上是zz1 == !0

注:!0是邏輯NOT零是:==> 1.

的代碼,如果條件爲:

  1. zz1 == !0==>zz1 == 1==> 8 == 1 ==>False or 0
  2. and 0&&any expression==>False(根據short-circuit evaluation)。
  3. 所以如果條件爲false並且printf不會被調用。

如果在else子句中添加printf,那麼它將執行。檢查@ideone

此外,假設如果更換由||&&即使再printf()函數將不會在你的代碼中調用,因爲zz2 = 4zz2 ==! 1==>zz2 == !1==>zz2 == 0==>4 == 0= => 0.

0 || 0 == 0所以如果條件將是錯誤的。

0

從句法上看,你的代碼是正確的。

zz1 ==! 0 //This is syntactically correct and evaluates to 0, zz1 has the value 4 
//4 == 1 evaluates to false ==> 0 

它評估爲0,因爲你是比較ZZ1到(!0)。 !0的計算結果爲1.同樣,!1的計算結果爲0.這不是按位的NOT操作。這是合乎邏輯的。

!9 == !1 == 0. 

要執行按位NOT操作,請改用'〜'標記。

~1 == -2 
~0 == -1 

C中'不等於'的運算符是'!='。要使您的代碼正常工作,請更改==!到!=

操作& &執行邏輯與操作。
在一段代碼

(zz1 != 0) && (zz2 != 1) 

第一條件表達式被選中。當且僅當它爲真時,纔會檢查下一個條件表達式。 如果第一個表達式(zz1!= 0)爲假,則整個表達式的值將減少爲0.