2

所以我已经看过其他标题相似的帖子,但没有一个建议的答案对我有用。

我有一个函数可以计算字符串中字符的频率:

int frequency(char *s, char c) {
  int i;
  for (i=0; s[i]; s[i]==c ? i++ : s++);

  return i;
}

它工作正常,但编译器给了我以下错误:

warning: pointer/integer type mismatch in conditional expression [enabled by default]

有人可以解释为什么

干杯

4

3 回答 3

1

i++是类型int,而类型s++char *。在条件表达式中,“then”和“else”分支中不能有两种不同的类型,因此会出现警告。

在这里,这段代码片段的作者试图变得聪明而简短,但他只是弄错了。我建议将其重写为

int frequency(const char *s, char c)
{
    int i;
    for (i = 0; s[i];)
         if s[i] == c
             i++;
         else
             s++;

    return i;
}
于 2013-06-02T17:51:27.130 回答
0

编写的代码使用参数s作为指向字符的指针,以及作为索引的字符数组i。该for循环用于迭代字符串,但当未找到匹配字符时,字符串的开头将被移动。

这是非常聪明的代码。聪明的代码很少是一件好事。

"It works"因为s[i]==c ? i++ : s++没有使用表达式的结果。每个分支执行一个动作,返回一个不同类型的值。这些值都没有在另一个表达式中使用。

我通常使用for循环来执行定义数量的迭代。在这种情况下,我认为while循环更合适。

用作s指针

int frequency(char *s, char c) {
  int count = 0;

  while (*s != 0) {
    if (*s == c) { 
      count++; 
    }
    s++;
  }

  return count;
}

用作s字符数组

int frequency(char s[], char c) {
  int count = 0;
  int current = 0;

  while (s[current] != 0) {
    if (s[current] == c) { 
      count++; 
    }
    current++;
  }

  return count;
}
于 2013-06-02T22:20:40.583 回答
0

每个表达式都必须有一个类型。对于这个表达式,

s[i]==c ? i++ : s++

目前尚不清楚该类型应该是什么。 i++给出一个整数,并s++给出一个char *. Achar *可转换为 an int,它基本上是指针是否为空的布尔值。因此,通过使表达式的类型 be int,编译器能够使其工作,但由于这是非常奇怪的情况,您会收到警告。

于 2013-06-02T17:56:21.983 回答