我看到一些C while循環與謂詞while(* ptr),而ptr通常是char *類型,這是如何工作的?這是否意味着「while()」也將接受除1或0以外的值作爲謂詞?我想知道在謂詞中發生了什麼?
回答
在C中,任何非零值都被視爲「真」,因此while (*ptr)
將循環,只要*ptr
爲非零。
在C中,任何零都被認爲是錯誤的,其他的東西都被認爲是真的。該代碼實質上是說「雖然ptr不爲空」,給出以null結尾的字符串是走過字符串的常用方法。
確切地說錯了。 0不正確。任何0都是錯誤的,其他的都是真的。 – dicroce 2011-02-06 03:47:32
確實,尷尬。我正在考慮過程編輯代碼和成功。 :( – 2011-02-06 03:56:19
C預計while()
子句的條件爲整數。如果整數爲零,則會退出while循環,否則將執行它的正文並再次評估條件。各種各樣的東西都以C爲整數,包括字符。字符(空字符)等於整數0
在C中,任何非零值都視爲true。
這是一個用來迭代C字符串的習慣用語,因爲C字符串被定義爲NUL終止。這是可行的,因爲NUL字符\0
的值爲零,如您所知,值爲零將導致while()
循環終止。
由於在C最常見的串類型是零終止的字符串是有意義的循環像這樣有時
while(*ptr)
{
printf("%c", *ptr);
ptr++;
}
遇到空字符,直到其基本上從字符移動到字符中的字符陣列。當然這是不好的形式,因爲'\0'
,null
和0
在給定的系統上不需要是相同的,但是在99%的環境中工作。
不,這是保證工作100%。一個空字符結束符將始終是零關於布爾構造。一個NULL指針可能不物理上包含所有零位,但總是在邏輯上等於0. – CashCow 2011-02-06 04:01:08
讓我們來稍微擴展一下。
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++);
益智更簡潔地寫:你可以這樣寫更簡潔還是?
- 1. NSPredicate - 無法爲謂詞生成SQL,我想知道爲什麼?
- 2. 我不知道發生了什麼
- 3. 我想知道這個腳本中發生了什麼?有什麼不同?
- 4. 我打破了我的代碼,不知道發生了什麼
- 5. 不知道發生了什麼 - C
- 6. 不知道發生了什麼
- 7. 不知道我的DataGrid控件的外觀發生了什麼
- 8. 我不知道終端發生了什麼事
- 9. 我不知道通過GameObjects的for循環發生了什麼
- 10. 我丟失了我的R文件。我不知道發生了什麼事。?
- 11. 我想了解這個變量賦值中發生了什麼
- 12. Infinate循環?遺漏了什麼?我不知道發生了什麼錯誤:500超時(不應該發生)
- 13. 使用MPI的鏈接庫,我不知道,發生了什麼後面發生了什麼
- 14. 我想知道這個Python程序發生了什麼。我已經包括了代碼
- 15. 我想知道Maven是什麼
- 16. 我如何知道爲什麼在SQLAlchemy中發生回滾?
- 17. OutOfMemoryError,我不知道什麼時候或爲什麼發生
- 18. 我想知道爲什麼這段代碼會產生2
- 19. 痣退出代碼-1002,我怎麼知道它發生了什麼?
- 20. 記錄從Mysql表中消失,我如何知道發生了什麼?
- 21. 我想知道在Java中
- 22. managedObjectContext是零...不知道發生了什麼
- 23. 有沒有人知道javaspec.org發生了什麼事?
- 24. 查詢性能;不知道發生了什麼
- 25. asp.net如何知道發生了什麼事件?
- 26. 有誰知道Parse.com文檔發生了什麼?
- 27. 不知道發生了什麼 - 沒有錯誤(Java新手)
- 28. Grails的UnexpectedRollbackException發生了:不知道爲什麼
- 29. 瞭解謂詞
- 30. s()謂詞在Prolog中做什麼?
while(* ptr)其中ptr是一個字符串將失敗時,該字符串恰好不是空終止。 – dicroce 2011-02-06 03:48:42