1

int および *node (ノードはカスタム構造体) で条件演算子 (?) を使用しようとしています。ここに私のコードと結果のエラーがあります。

ノード:

struct node {
  int num;
  node *next;
};

条件付き実装:

void PrintNodes(node *head_p) {
  int done = 0;
  while (!done) {
    PrintNodeData(head_p);
    // if (head_p->next==NULL) {
    //   done++;
    // } else {
    //   head_p++;
    // }
    ((head_p->next==NULL) ? done : head_p)++;
  }
}

条件ステートメントの上のコメントに同等のif...then...elseステートメントがありますが、それを 1 行に短縮できるようにしたいだけです。

編集

エラー:

test.cc: In function ‘void PrintNodes(node*)’:
test.cc:28:36: error: operands to ?: have different types ‘int’ and ‘node*’
make: *** [all] Error 1
4

4 に答える 4

2

あなたはそれを行うことはできません !条件演算子は、同じ型または「互換性のある」型 (つまり、一方を他方に暗黙的に変換できる) を持つ 2 つのオペランドを必要とします。しかし、ここではオペランドの型がintand でありnode*(さらに、結果を の左辺値として使用しようとしているため++、型はint&andであると言えますnode*&)、互換性がありません。

また、単にこれではないのはなぜですか?

void PrintNodes(node *head_p) {
  while (head_p) {
    PrintNodeData(head_p);
    head_p = head_p->next;  // was: head_p++;
  }
}
于 2013-05-23T13:36:06.130 に答える
1

true に設定するために ++ を使用せず、bool を使用します。

void PrintNodes(node *head_p) {
  bool done = false;
  while (!done) {
    PrintNodeData(head_p);
    if (head_p->next==NULL)) done = true;
    else head_p++;
  }
}

head_p++はずなのにhead_p= head_p-next

もちろん、難読化されたコードの競争に参加している場合を除きます。その場合は、これが良い代替手段になります。

void PrintNodes(node *head_p) {
  node* done = nullptr;
  while (!done) {
    PrintNodeData(head_p);
    ((head_p->next==NULL) ? done : head_p)++;
  }
}
于 2013-05-23T13:35:49.603 に答える