C 此语句中使用的无意义三元运算符

C 此语句中使用的无意义三元运算符,c,C,你好, 我有一个函数,它将一个指针分配给另一个指针,该指针是字符串结构的一个元素 此字符串结构的目的是获取和设置实际字符串的长度 然而,我不明白他们为什么使用三元运算符。这对我来说毫无意义。除了str->len=src之外,似乎没有其他条件。它只分配,不比较任何东西 gcc 4.7.2 c89 这样做会不会更简单、更易读 typedef struct tag_str_t str_t; struct tag_str_t { char *buf; size_t len; }; s

你好,

我有一个函数,它将一个指针分配给另一个指针,该指针是字符串结构的一个元素

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

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

gcc 4.7.2
c89
这样做会不会更简单、更易读

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;
}
非常感谢您的建议,

调用
strlen(NULL)
将生成一个segfault,该代码只表示如果src字符串为NULL,则长度为零,如果不使用
strlen
计算长度,则代码:

str->len = strlen(src);
相当于:

str->len = src ? strlen(src) : 0;
我添加了括号和额外的表达式,以指示表达式的组件在哪里。您的评论似乎表明您认为三元运算符中的条件是
str->len=src
,但这是错误的;赋值的优先级很低


同样,测试的目的是确保不会使用空指针调用
strlen()
,这将导致崩溃。

三元运算符在那里不是用于比较,而是用于检查
src
。假设如果将
NULL
作为
src
传递,则代码将调用
未定义的行为
。因此,三元运算符检查如下:

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

@alk True,我不知道有哪种实现会在许多体系结构上实现它,因为空空间现在覆盖了足够大的范围,或者除非strlen执行空检查(从代码中可以看出它没有)。谢谢,我现在明白了,它类似于str->len=(src!=NULL)?strlen(src):0@是的,没错。C语言中的正常值可以计算为布尔表达式。谢谢,钱终于花掉了。通常情况下,我总是将我的条件用括号括起来以避免混淆。与其说表现出未定义的行为,不如说是调用未定义的行为。使用未明确允许的空指针调用库函数会调用未定义的行为,
strlen()
未记录为接受空指针,因此使用空指针调用库函数会调用未定义的行为。@JonathanLeffler-感谢您的澄清。这就是我喜欢的地方,人们可以在这里通过很多方式学习:-)
if( src != NULL )
    str->len = strlen(src) ; 
else
    str->len = 0 ;