2011-02-06 90 views
2

我看到一些C while循環與謂詞while(* ptr),而ptr通常是char *類型,這是如何工作的?這是否意味着「while()」也將接受除1或0以外的值作爲謂詞?我想知道在謂詞中發生了什麼?

+0

while(* ptr)其中ptr是一個字符串將失敗時,該字符串恰好不是空終止。 – dicroce 2011-02-06 03:48:42

回答

2

在C中,任何非零值都被視爲「真」,因此while (*ptr)將循環,只要*ptr爲非零。

0

在C中,任何零都被認爲是錯誤的,其他的東西都被認爲是真的。該代碼實質上是說「雖然ptr不爲空」,給出以null結尾的字符串是走過字符串的常用方法。

+0

確切地說錯了。 0不正確。任何0都是錯誤的,其他的都是真的。 – dicroce 2011-02-06 03:47:32

+0

確實,尷尬。我正在考慮過程編輯代碼和成功。 :( – 2011-02-06 03:56:19

0

C預計while()子句的條件爲整數。如果整數爲零,則會退出while循環,否則將執行它的正文並再次評估條件。各種各樣的東西都以C爲整數,包括字符。字符(空字符)等於整數0

0

在C中,任何非零值都視爲true。

0

這是一個用來迭代C字符串的習慣用語,因爲C字符串被定義爲NUL終止。這是可行的,因爲NUL字符\0的值爲零,如您所知,值爲零將導致while()循環終止。

0

由於在C最常見的串類型是零終止的字符串是有意義的循環像這樣有時

while(*ptr) 
{ 
    printf("%c", *ptr); 
    ptr++; 
} 

遇到空字符,直到其基本上從字符移動到字符中的字符陣列。當然這是不好的形式,因爲'\0',null0在給定的系統上不需要是相同的,但是在99%的環境中工作。

+0

不,這是保證工作100%。一個空字符結束符將始終是零關於布爾構造。一個NULL指針可能不物理上包含所有零位,但總是在邏輯上等於0. – CashCow 2011-02-06 04:01:08

1

讓我們來稍微擴展一下。

C中的while語法表示「如果條件爲真,則執行正文;如果它仍然爲真,則再次執行正文。」根據卡薩布蘭卡筆記,C中的任何0值都是「假」;任何非零值都是「真」。 (這是值得考慮的,爲什麼他們選擇了,你可以得到一個很好的提示,如果你看一下PDP-11指令集。)所以你可以擴展出

while /* the expression *ptr is nonzero*/) 
    /* do this */ 

表達*prt僅僅意味着whatever is at the address stored in ptr

使用此模式的常見代碼是字符串處理。假設我們有

char myString[] = "Hello, world!" ; // remember char myString[] is equivalent 
            // to char * myString in C 

char * ptr = myString;    // note ptr points to myString[0] 

while(*ptr){ 
    putc(*ptr); 
    ptr ++; 
} 

現在只要ptr指向字符串中的字符,這是非零,循環不斷。但按照C中的慣例,所有字符串以NUL結尾,即字節寬度爲0.所以當循環達到最後一個NUL時,* ptr爲0,循環結束。

您可以通過

char * ptr = myString; 
while(*ptr) putc(ptr++); 

益智更簡潔地寫:你可以這樣寫更簡潔還是?

相關問題