黑马程序员技术交流社区

标题: 有一个问题怎么都想不通,请大家帮忙看看 [打印本页]

作者: 迎着太阳    时间: 2014-12-16 15:12
标题: 有一个问题怎么都想不通,请大家帮忙看看
int char_contains(char str[],char c)
{
        int i = -1;
        while(str[++i] != c && str[++i] != '\0');

        return str[i] == c ? 0 : 1; //也可以是:return str[i] != '\0'
}

为什么 return str[i] != '\0';也可以呢?实在是不明白啊
作者: 从今以后    时间: 2014-12-16 15:48
“return str[i] == c ? 0 : 1;”这里没写反吗= =包含c返回0,不包含返回1吗。。
退出while有两种:
(1)str[i] == c;
如果(1)情况成立,那么str[i] != '\0',从而return str[i] != '\0'这条语句条件判断成立,值为1,return 1,包含字符返回1。
(2)str[i] == '\0'
如果(2)成立,那么说明直到遍历整个字符串完毕也没找到包含的字符c,return str[i] != '\0'中条件判断因为str[i] == '\0'而为假,值为0,return 0,不包含字符返回0。
作者: sajiner2    时间: 2014-12-16 15:56
如果这个函数的作用是判断str数组中是否含有c字符的话,应该是有问题的。两个++i有问题。我觉得应该是这样:
  1. nt char_contains(char str[],char c)
  2. {
  3.         int i = -1;
  4.         while(str[++i] != c && str[i] != '\0');

  5.         return str[i] == c ? 0 : 1; //也可以是:return str[i] != '\0'
  6. }i
复制代码


而楼主的问题,return str != '\0';如果str等于'\0'的话,意味着遍历到最后一位字符也没有找到字符c,所以是等效的。
作者: mayhaha    时间: 2014-12-16 16:05
加油 加油
作者: se7ven    时间: 2014-12-16 16:07
从今以后 发表于 2014-12-16 15:48
“return str == c ? 0 : 1;”这里没写反吗= =包含c返回0,不包含返回1吗。。
退出while有两种:
(1)str == ...

恩,我觉得你这是正解……{:3_53:}
作者: 迎着太阳    时间: 2014-12-16 18:53
从今以后 发表于 2014-12-16 15:48
“return str == c ? 0 : 1;”这里没写反吗= =包含c返回0,不包含返回1吗。。
退出while有两种:
(1)str == ...

不好意思啊,我写反了:L,你的解释太好了,我终于转过弯过来了,非常谢谢
作者: 迎着太阳    时间: 2014-12-16 18:55
sajiner2 发表于 2014-12-16 15:56
如果这个函数的作用是判断str数组中是否含有c字符的话,应该是有问题的。两个++i有问题。我觉得应该是这样 ...

额 不好意思,我又写错了,这加了两次了,汗哪




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2