2011-12-23 188 views
1

我在看下面的一段代碼:積分n指定的條件「if(n/10)」是什麼?

void printd(int n) 
{ 
    if (n < 0) { 
     putchar('-'); 
     n = -n; 
    } 
    if (n/10) 
     printd(n/10); 
    putchar(n % 10 + '0'); 
} 

我知道,第一if語句罰款,但第二個有我困惑的幾個百分點。

本身,因爲「n」是一個整數,我知道n/10會將小數點左移一次 - 有效地移除數字的最後一位;然而,我在理解一個事情本身如何成爲一個條件而不知道結果是什麼時遇到了一些麻煩。爲什麼不是((n/10)> = 0)或什麼的情況?

此外,爲什麼'0'傳入putchar()調用?

有人可以告訴我,如果你要用英語朗讀它怎麼讀?

謝謝!

+2

在一個if語句條件中,零:= false,其他都是真的...... – 2011-12-23 05:08:57

+0

啊好的,所以它每次除以10,直到結果爲0;在不等於零時執行代碼。 – bqui56 2011-12-23 05:12:47

+2

另外,縮進在第二個「if」中會引起誤解。 'putchar'不在裏面。 – 2011-12-23 05:13:44

回答

3

如果結果爲0,則n/10將評估爲false,否則爲true。本質上它檢查是否n > 10 && n < -10(-10不來這裏發揮作用,由於n = -n代碼)

+ '0'爲字符偏移量,字符「0」 - 「9」不被數字0-9表示,而是在一個偏移量(以ascii 48-57)。

有人可以告訴我,如果你要用英語朗讀它怎麼讀?

如果你談論的是有條件的,那麼我會說:「如果整數n除以10不爲零」

+0

檢查'n <-10'的唯一時間是在進入函數時(並且機器使用2的補碼運算),如果'n'是'INT_MIN'。 – 2011-12-23 05:35:36

0

n/10不會移位十進制數,因爲n是一個整數。如果n = 25,那麼n/10將是2(沒有任何小數點),類似地,如果n = 9,那麼n/10將是0,在這種情況下if條件將不會被滿足。

關於+'0',由於n%10產生整數結果,並且在putchar中打印的是char,所以需要將該整數轉換爲char。這通過將ascii值0添加到整數來完成。

0

在C中,沒有單獨的布爾類型;像a > b這樣的表達式如果爲false,則評估爲零,如果爲真,則爲非零。有時你可以在int中測試零或非零時利用這一點。

至於'0',只是執行字符算術,以便打印右側字符。零字符具有不爲零的ASCII編碼值,所以n值被用作與該編碼的偏移以獲得打印出的右數字數字。

+1

有時,您需要閱讀C99(或C11)標準以瞭解關於'_Bool'和''的信息。 – 2011-12-23 05:34:17

+0

它是**保證,** a> b'評估爲0或1(而不是一些其他非零值)。只是在**條件下**表達式的非零值被視爲* true *。 – Jens 2012-05-29 18:11:38

+0

@Jens:我從來沒有聲稱'a> b'會評估爲0或1以外的任何值。我所說的只是它非零,如果爲真,*這是真的,因爲1不是0 *。 – 2012-05-29 19:05:00