其实,楼主不明白的是:
1. if()或 while()后面的表达式是什么?
答案是: 从C语法的角度,if()或 while()后面的表达式是什么都可以。运行时(应该是编译时编译成这样子),先求整个表达式的值。结果是一个数值。 C吧这个数值看成逻辑值:白话的说,就是,如果这个值是0,就认为是 假(False),除0之外,都是真(TRUE)。
如果是真,执行接下来的代码块,否则跳过。
你可以直接写 if(i),而不必写 if(i != 0 )
2. 那么再看具体代码,while(*p)和if(*p)中的*p是什么意思?:就是判读*p是不是0 呗。楼主不了解的是,*p什么时候是0??
您需要知道:C语言字符串以0结束。
也就是说,您写 *p = "input zifuchuan";时 ,实际存内存存放的歼余是:
‘i’ ‘n’ ‘p’ ‘u’ ‘t’ ‘ ’ ‘z’ ‘i’ ‘f’ ‘u’ ‘c’ ‘h’ ‘u’ ‘a’ ‘n’ 0
while(*p)的意思,翻译过来就是:”当p指向的字符串没有到达结束的0时“
注意:循散改宏环体里。必然有p++的移动操作
‘i’ ‘n’ ‘冲册p’ ‘u’ ‘t’ ‘ ’ ‘z’ ‘i’ ‘f’ ‘u’ ‘c’ ‘h’ ‘u’ ‘a’ ‘n’ 0
^ ^
| |
p -------------------------------------------> p
相当于*p!=null,意思就是p指向的内容不为空
在C语言中,这是字符串处理时常用的技巧。
这样写的程序最后的机器码很精简,充分利用到CPU本身的功能。
*p是当前p指向的悄拆字符,在字符串结尾,*p必为0。这时while或if都得出“假”,条件不成立。
不过必须启悉枣指出,这样写有一个小漏洞,如果p为陆哗空指针时将出现非法操作。所以一般是这样写:
if(p&&*p)
while(p&&*p)
由于C对于逻辑操作是短路型的,所以这样就可避免对空指针的操作,程序将更加健康。