所以我已经看过其他类似标题的帖子,但没有一个建议的答案对我有用。
我有一个函数来计算字符串中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]
有人可以解释原因吗
干杯
答案 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;
}