!*s
在此功能中做了什么:
void f( char *s) {
if( !*s ) {
return;
}
f( s+1 );
putchar( *s );
}
int main( void ) {
f("kernighan");
putchar('\n');
return 0;
}
该程序的输出为nahginrek
;我觉得它换了
左边的角色有正确的角色并一直这样做直到它到达中间?
答案 0 :(得分:5)
它检查s
指向的字符是否为ascii null(NUL)' \ 0'这是C字符串中的字符串分隔符(最后一个字符)。
!*s
为*s
, '\0'
将为真。
请注意,它与检查s
是否为NULL
不同,这意味着指针s
指向零地址。
答案 1 :(得分:3)
正如其他人已经提到的那样,
if( !*s )
相当于
if( !(*s) )
或
if( *s == 0 )
添加一些引用,引用C11
,章节§6.5.3.3,一元算术运算符,第5段,
[...]表达式
!E
相当于(0==E)
。
整个块
if( !*s ) {
return;
}
如果你已经到达字符串的空终止符(which has a value 0
),确保函数返回。
答案 2 :(得分:1)
它测试s
指向的字符是否为空(ascii字符\0
)。 \0
字符标记C样式字符串的结尾,因此测试基本上是检查递归是否已到达字符串的末尾。
在取消引用指针!
后,将评估逻辑非*s
。这不是对指针本身有效性的测试,看起来更像if (!s)
或if (s)
。
答案 3 :(得分:1)
s
是一个指针。
*s
取消了一个指针,该指针给出了存储在指针指向的位置的值。
和!*s
表示获取指针指向的值,并检查获取的值是否为\0
。