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在条件语句上方的注释中有等效的语句,我只是希望能够将其修剪为一行。

编辑

错误:

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

6

只是不要。做明确的事情。

长答案是 C++ 有一个类型系统,而你试图做的事情违反了它。

于 2013-05-23T13:27:04.703 回答
6

我在条件语句上方的注释中有等效的 if...then...else 语句,我只是希望能够将其修剪为一行。

不要这样做。首先,因为它使您的代码不必要地难以阅读。其次,因为条件运算符中的两个表达式的类型都不能转换为另一个表达式的类型。

根据 C++11 标准的第 5.16/3 段:

[...] 如果第二个和第三个操作数具有不同的类型并且具有(可能是 cv 限定的)类类型,或者如果两者都是相同值类别和相同类型(除了 cv 限定)的 glvalue,则进行尝试将这些操作数中的每一个转换为另一个的类型。[...]

于 2013-05-23T13:27:40.637 回答
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

我会使用 bool,而不是使用 ++ 将其设置为 true:

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 回答