'(c = *str) != 0' 是什么意思?
What does `(c = *str) != 0` mean?
int equiv (char, char);
int nmatches(char *str, char comp) {
char c;
int n=0;
while ((c = *str) != 0) {
if (equiv(c,comp) != 0) n++;
str++;
}
return (n);
}
"(c = *str) != 0"到底是什么意思? 有人可以向我解释一下或帮助我提供正确的术语以自己搜索解释吗?
此表达式包含两部分:
c = *str
- 这是取消引用指针的简单c
赋值,val != 0
- 这是与零的比较。
这是有效的,因为赋值是一个表达式,即它有一个值。赋值的值与分配的值相同,在本例中为指针指向的char
。所以基本上,你有一个循环,将一个以 null 结尾的字符串跟踪到末尾,将每个单独的char
分配给c
。
请注意,!= 0
部分在 C 中是多余的,因为while
循环的控制表达式隐式地与零进行比较:
while ((c = *str)) {
...
}
从语法的角度来看,第二对括号是可选的,但它保留在这样的赋值中,以指示赋值是有意的。换句话说,它告诉代码的读者你真的想写一个赋值c = *str
,而不是一个比较c == *str
,这在循环控制块中更常见。第二对括号也会禁止显示编译器警告。
令人困惑的是,
while ((c = *str) != 0) {
是相当容易阅读的重言式
while (c = *str) {
这也具有将字符分配给c
*str
的作用,一旦*str
被