[英]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.