1

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;

しかし、構文チェッカープラグインは警告を出します:pointer/integer type mismatch in conditional expression ('Position' (aka 'struct Node *') and 'int')

では、式の型は C の条件式と同じでなければなりませんか?

私の英語はとても下手なので、必要に応じて私の質問を編集してください。ありがとうございました!

4

1 に答える 1

3

C99標準セクションのドラフトを見ると、6.5.15 条件付き演算子のパラグラフ3は次のように述べています。

次のいずれかが 2 番目と 3 番目のオペランドに適用されます。

— オペランドは両方とも算術型です。

— 両方のオペランドが同じ構造体または共用体型を持っています。

— 両方のオペランドが void 型です。

— 両方のオペランドは、互換性のある型の修飾または非修飾バージョンへのポインターです。

— 一方のオペランドはポインタで、もう一方はヌル ポインタ定数です。また

— 一方のオペランドはオブジェクトまたは不完全型へのポインターであり、もう一方は void の修飾または非修飾バージョンへのポインターです。

astruct Node *でありint、これらの基準のいずれにも一致しませんが、それはあなたの意図ではないようです。この式でコンマ演算子を使用しているように見えますが、コンマ演算子の優先順位が最も低いため、実際には次のようになります。

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

そのため、オペランド 3の結果の代わりに、3 番目のオペランドに対してこれを本当に意味していた可能性が最も高いNULL戻り値です。printfint

(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 ) ;
 ^                                                                  ^ 
于 2013-10-15T02:18:02.830 に答える