这个条件是如何解析的?

时间:2011-10-03 20:52:42

标签: c++

对于某些上下文,条件在正常类型的算法中用于查找链表循环:

来自链接:http://vijayinterviewquestions.blogspot.com/2007/05/how-would-you-detect-loop-in-linked.html

p=head;
q=head->next;

while(p!=NULL && q!=NULL) {
    if(p==q) { //Loop detected! exit(0); }

    p=p->next;
    q=(q->next)?(q->next->next):q->next;
}

// No loop.

该行:

q=(q->next)?(q->next->next):q->next;

得到解析好像?我对这个条件中的运算符优先级有点困惑 - q取左边的值吗?或整个有条件的?

5 个答案:

答案 0 :(得分:5)

可以扩展为:

if (q->next) {
  q = q->next->next;
} else {
  q = q->next;
}

答案 1 :(得分:2)

它被称为ternary运算符,它意味着

if(q->next)
  q->next->next;
else
  q->next;

答案 2 :(得分:1)

它采用整个条件表达式的值,因为赋值运算符具有very low precedence(仅次于throw,)。您问题中的表达式等同于:

q = q->next ? q->next->next : q->next;

为了使作业具有优先权,您必须编写如下内容:

(q = q->next) ? q->next->next : q->next;

当然,总是将q->next分配给q,然后继续评估剩余的条件操作数之一。

答案 3 :(得分:1)

您正在看三元运算符的示例。

q=(q->next)?(q->next->next):q->next;

也可以理解为:

if(q->next)
{
    q = (q->next->next)
}
else
{
    q = q->next;
}

三元运算符的优先级低于大多数其他运算符(除了逗号运算符,“throw”和所有赋值运算符)。

http://en.cppreference.com/w/cpp/language/operator_precedence

答案 4 :(得分:1)

如果查看operator precedence table,您会看到三元运算符?:位于列表底部附近。这意味着将首先评估其中的子表达式。这个分组中的括号只是强化了这一事实;为了便于阅读,可能会添加它们。

通过比较零来评估表达式(q->next)的开头以查看它是否为真;在指针的情况下,NULL指针为零或假,任何其他值为真。

如果?左边的部分为真,则三元运算符的结果将是?之后的第一个表达式,否则它将是:之后的表达式