【问题标题】:Does expression's type must be same as conditional-expression in C?表达式的类型是否必须与 C 中的条件表达式相同?
【发布时间】:2013-10-15 02:13:09
【问题描述】:

我写了一些代码如下,而函数DeleteNextNode返回一个名为Position的类型:

return (the_checked_position->next == position_to_delete) ?
     DeleteNextNode(the_checked_list, the_checked_position) :
     printf("%s\n", "No such node in the list, delete failed."), NULL;

但语法 checher 插件会发出警告:pointer/integer type mismatch in conditional expression ('Position' (aka 'struct Node *') and 'int')

那么表达式的类型必须和C语言中的条件表达式相同吗?

我的英语很差,所以如果有必要你可以编辑我的问题。谢谢!

【问题讨论】:

    标签: c conditional-operator


    【解决方案1】:

    如果我们查看draft C99 standard 部分6.5.15 条件运算符 段落3 说:

    第二个和第三个操作数应满足以下条件之一:

    ——两个操作数都有算术类型;

    ——两个操作数具有相同的结构或联合类型;

    ——两个操作数都是void类型;

    ——两个操作数都是指向兼容类型的合格或不合格版本的指针;

    ——一个操作数是一个指针,另一个是一个空指针常量;或

    — 一个操作数是指向对象或不完整类型的指针,另一个是指向 void 的限定或非限定版本的指针。

    struct Node *int 不符合这些条件中的任何一个,但这似乎不是您的意图。我看到你在这个表达式中使用了 comma operator 但是由于 comma operatorlowest precedence 它实际上是这样的:

    return ( operand 1 ? operand 2 : operand 3 ) , NULL;
    

    所以 operand 3 的结果不是 NULL 而是 printf 的返回 int 所以很可能你真的是指第三个操作数:

    (printf("%s\n", "No such node in the list, delete failed."), NULL)
    

    这将符合上述标准,并且可能是您最初想要的。完全更正的代码是这样的,在代码下方添加了括号:

    return (the_checked_position->next == position_to_delete) ?
     DeleteNextNode(the_checked_list, the_checked_position) :
     ( printf("%s\n", "No such node in the list, delete failed."), NULL ) ;
     ^                                                                  ^ 
    

    【讨论】:

    • 抱歉,我听不懂你在说什么,而你的回答好像漏掉了一些标点符号。
    • @acgtyrant 很抱歉没有尽快回复,我没有收到评论通知。由于, 的工作方式,您需要在printf(..) , NULL 周围加上括号,因此您收到错误消息。我将完全固定的代码添加到我的答案中。
    • @acgtyrant 我回答的第一部分是回答条件运算符的第二个和第三个参数的类型要求。不幸的是,答案并不简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多