对于某些上下文,条件在正常类型的算法中用于查找链表循环:
来自链接: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取左边的值吗?或整个有条件的?
答案 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指针为零或假,任何其他值为真。
如果?
左边的部分为真,则三元运算符的结果将是?
之后的第一个表达式,否则它将是:
之后的表达式