本声明中使用了无意义的三元运算符

时间:2013-01-16 07:28:41

标签: c

gcc 4.7.2
c89

您好,

我有这个函数,它指定一个指针作为字符串结构元素的另一个指针。

此字符串结构的目的是获取和设置实际字符串的长度。

但是,我不明白他们为什么使用三元运算符。这对我来说没有意义。除str->len = src之外似乎没有任何条件。只分配和不比较任何东西。

typedef struct tag_str_t str_t;
struct tag_str_t {
    char *buf;
    size_t len;
};

static void string_set(str_t *str, const char *src)
{
    str->buf = (char*)src;
    str->len = src ? strlen(src) : 0;
}

通过这样做,它会变得如此简单和可读吗?

str->len = strlen(src);

非常感谢任何建议,

3 个答案:

答案 0 :(得分:4)

调用strlen(NULL)将生成段错误,该代码只是说src字符串是否为NULL,长度为零,如果不使用strlen计算长度。

答案 1 :(得分:4)

代码:

str->len = src ? strlen(src) : 0;

相当于:

str->len = ((src != 0) ? strlen(src) : 0);

我添加了括号和额外的表达式来指示表达式的组成部分。您的评论似乎表明您认为str->len = src是三元运算符中的条件,但这是错误的;赋值的优先级非常低。

由于Jesus Ramos也是explained,测试的目的是确保不使用NULL指针调用strlen(),这会导致崩溃。

答案 2 :(得分:1)

在那里使用三元运算符不进行比较,而是检查src。假设您将NULL作为src传递,则代码将调用Undefined Behavior。因此,三元运算符检查为:

if( src != NULL )
    str->len = strlen(src) ; 
else
    str->len = 0 ;