C - 三元运算符

时间:2015-06-17 17:06:54

标签: c

为什么我这样做:

int     ft_is_alpha(char *str, int i)
{
    return (((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) ? 0 : 1);
}

它崩溃但是,当我这样做时:

int     ft_is_alpha(char *str, int i)
{
    if ((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))
    {
        return (1);
    }

    return (0);
}

它没有崩溃..
我把这个函数称为

for (i = 0; str[i] != '\0'; ++i)
    {
        if (ft_is_equal_to(str, i))
        {
            ++count;
            int     j;

            j = i - 1;
            while (str[++j] != '\0' && ft_is_alpha(str, j))
            {
                ++length;
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

我不知道崩溃的含义,第一个函数正确实现了测试但返回了正确值的反面。三元运算符的分支应与if (cond) {} else {}语句中的分支顺序相同。它应该是:

int ft_is_alpha(char *str, int i) {
    return (((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) ? 1 : 0);
}

由于条件已经计算为布尔值,您可以通过删除不需要的三元运算符和一些括号来简化代码:

int ft_is_alpha(const char *str, int i) {
    return (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z');
}

可以删除最后一组括号,但可读性较差。

请注意,str应声明为const char *,因为函数不会修改字符串。同时删除return (1);中的括号,不需要它们并将其视为错误的样式。

此外,为什么不分别通过str[i]而不是stri? API的这种更改将使代码更易于阅读,执行速度更快,使用更安全。