表达式的类型必须与C中的条件表达式相同吗?

时间:2013-10-15 02:13:10

标签: c conditional-operator

我写了一些如下代码,而函数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中的条件表达式相同吗?

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

1 个答案:

答案 0 :(得分:3)

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

  

以下其中一项适用于第二和第三个操作数:

     
    

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

         

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

         

- 两个操作数都有void类型;

         

- 两个操作数都是指向兼容类型的限定或非限定版本的指针;

         

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

         

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

  

struct Node *int与这些条件中的任何一个都不匹配,但似乎不是您的意图。我看到你在这个表达式中使用逗号运算符,但由于逗号运算符具有lowest precedence,所以它实际上是有效的:

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

因此操作数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 ) ;
 ^                                                                  ^