簡體   English   中英

我不明白這個用指針編寫的 C 程序

[英]I don´t understand this C program made with pointers

我看到這個 C 程序使用指針將第一個字符串復制到第二個字符串中。

void copy(char const *s1, char *s2)
{ 
    for(;(*s2=*s1);++s1,++s2){};
}

我不明白停止 for 循環的條件,因為我可以寫(*s2=*s1)!='\\0'並且它可以工作,但是如果我不寫 !='\\0' 它也有效。 for 循環如何知道何時停止?

單引號之間的字符是一個字符。 字符\\0的值為0因此

char a = '\0`;

等於

char a = 0;

因此if (x != '\\0')等於if (x != 0) ,這等於if (x)在條件中作為for一部分類似。

括號表示測試標准是對s1指向的位置(左操作數)進行賦值的結果。 換句話說,循環一直運行直到*s2值為 false。

(*s2=*s1)!='\\0'相當於(*s2=*s1)!=0 ,相當於(*s2=*s1) (*s2=*s1)==true如果您願意。 顯然非零值被評估為真,所以循環運行直到第二個字符串有一個 nul 終止符。

這是 C 如何區分真假的核心。

is any non-zero value (any bit on in an integer). 是任何非零值(整數中的任何位)。 雖然條件測試如==>產生值1任何非零值都適用於 true。

is a value of zero (all bits off in an integer), which includes NULL in pointers. 是零值(整數中的所有位都關閉),其中包括指針中的NULL

'\\0'的值當然是一個二進制零,所以for條件部分中的(*s2++=*s1++)對非零進行隱式測試,這樣就可以了,直到\\0被復制. \\0返回 false 並退出循環。 添加您自己的!='\\0'就是為它添加一個顯式測試。

If you just used an incorrect *s1++ = *s2++ != '\\0' without the parenthesis it would be treated as a very buggy *s1++ = (*s2++ != '\\0') which would assign a series of 1's to *s1 followed by a '\\0' to terminate the "string".如果你只是使用了不正確的*s1++ = *s2++ != '\\0'而不帶括號,它會被視為一個非常有問題的*s1++ = (*s2++ != '\\0')它會分配一系列 1到 *s1 后跟一個'\\0'以終止“字符串”。 哎呀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM