C:什么是(exp1)? (exp2)? (exp3) : (exp4) : (exp5) 运算符呢?

C: What does (exp1)? (exp2)? (exp3) : (exp4) : (exp5) operator do?

我看到 C 行看起来像这样:

rFrameL    = block_a.available    ?
    img->mb_data[block_a.mb_addr].mb_field ?
    refPic[list][block_a.pos_y][block_a.pos_x]:
    refPic[list][block_a.pos_y][block_a.pos_x] * 2:
    -1;

这似乎是嵌套的 if 和 else 表达式,但我不知道它究竟是如何工作的。当 (exp1) 为真时返回 (exp3) 吗? (exp2) 返回时是否返回 (exp4)? 当 (exp1) 和 (exp2) 为假时是否返回 (exp5)?

带括号的隐式操作顺序:

rFrameL    = block_a.available    ?
    (img->mb_data[block_a.mb_addr].mb_field ?
       refPic[list][block_a.pos_y][block_a.pos_x]:
       refPic[list][block_a.pos_y][block_a.pos_x] * 2):
    -1;

给定 a?b:c,这意味着 "does a evaluate to true, if yes then evaluate b, otherwise evaluate c"。在上面的表达式中,当遇到 ? 时,正在计算 b,因此它会启动一个新的三元运算。遇到的第一个 : 与第二个 ? 匹配,然后第二个 : 结束对 b 的评估。

这是三元运算符格式的嵌套 if-else 语句。 这 '?'指的是 'if' 是用 ':'

中的答案解决的

简单来说,下面的代码类似于三元运算符格式:

if (exp1)
{
  if(exp2)
  {
    if(exp3)
    {
      exp4;
    }
    exp5;
  }
  exp6;
}