条件表达式中的指针/整数类型不匹配

时间:2013-06-02 17:48:16

标签: c compiler-warnings conditional-expressions

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

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

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]

有人可以解释原因吗

干杯

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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;
}