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