C ++具有不同类型作为参数的条件运算符

时间:2013-05-23 13:25:20

标签: c++ pointers conditional-operator

我正在尝试在int和*节点上使用条件运算符(?)(节点是自定义结构)。这是我的代码,以及由此产生的错误。

节点:

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 个答案:

答案 0 :(得分:6)

  

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

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

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

  

[...]如果第二个和第三个操作数具有不同的类型并且具有(可能是cv-qualified)类   类型,或者如果两者都是相同值类别和相同类型的glvalues,除了cv-qualification,an   尝试将每个操作数转换为另一个操作数的类型。 [...]

答案 1 :(得分:5)

请不要。做明确的事。

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

答案 2 :(得分:2)

你做不到!条件运算符需要两个具有相同类型的操作数或" compatible"类型(即,一个可以隐式转换为另一个)。但是,您的操作数类型为intnode*(此外,您还尝试将结果用作++的左值,因此我们可以说类型为{ {1}}和int&),它们不兼容。

另外,为什么不简单呢?

node*&

答案 3 :(得分: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)++;
  }
}