在鱼C论坛课后习题遇到了下面这段代码,简记下对其中while(*target++ != ‘\0’) 的理解
#include <stdio.h>#define MAX 1024int main()
{char str[MAX];char *target = str;int length = 0;printf("请输入一个字符串:");//实现读取键盘中的输入并赋入str中:fgets(str, MAX, stdin);while (*target++ != '\0'){length++;}printf("您总共输入了 %d 个字符!\n", length - 1);return 0;
}
程序想实现strlen函数的功能
故 while(*target++ != ‘\0’) 需要实现的功能为:
判断读入的是否为结束符’\0’,若不是,计数变量length++并读取下一个字符
- 你们可能对 target++ != ‘\0’ 这一行代码有疑问,这里我给大家解释下。首先在“运算符的优先级和结合性”(http://bbs.fishc.com/thread-67664-1-1.html)可以查到自增运算符(++)的优先级比取值运算符()要高,所以 *target++ 相当于 *(target++),先执行自增运算符,再取值。但由于这是一个后缀的自增运算符,所以自增的效果要在下一条语句才会生效,因此这里取出来的依然是 target 地址自增前指向的数组元素的值
但特殊的是:
后缀运算符特性:效果要在下一条语句才能生效
所以执行顺序可理解为:
while(*target != 0)
(target++)
循环体
(但是后缀运算符++的优先级是高于取值运算符 * 的!!)