C - 三元运算符

标签 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;
            }
        }
    }

最佳答案

我不知道你所说的崩溃是什么意思,第一个函数正确地实现了测试,但返回了与正确值相反的值。三元运算符的分支应与 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);
}

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

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 的这一变化将使代码更易于阅读、执行速度更快且使用更安全。

关于C - 三元运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30898012/

相关文章:

c - +0.0 和 -0.0 上的哪些运算和函数给出不同的算术结果?

c - 如何在 GDB 中打印#defined 常量?

c - 使用 sigwait 处理 SIGQUIT

c - 如何在C中使用printf和scanf处理char16_t或char32_t?

C 读取文件后无法写入

c - 为什么 abs() 和 fabs() 在 C 中的两个不同的头文件中定义

比较 C 中不同大小的矩阵乘法执行时间

c - 如何将固定主元的迭代快速排序更改为随机主元的迭代快速排序?

c - 在读取结构体中的数据之前检测其是否已损坏

c++ - ABI稳定性: When do I break ABI?