繁体   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