这段代码有什么意义?

时间:2012-03-21 09:04:59

标签: c++ opencv

我正在研究OpenCV的代码,我遇到了接下来的几行:

函数的var是:

CvMat* _err;
CvMat* _mask;
int i, count = _err->rows*_err->cols, goodCount = 0;
 for( i = 0; i < count; i++ )
    goodCount += mask[i] = err[i] <= threshold;    // This line is strange for me
return goodCount;

我指示的线路实际上是做什么的?因为,叫我奇怪,我从未见过这样的事情。

供您参考:

  • 是的,代码正在运行:D
  • 代码是CvModelEstimator2::findInliers函数的一部分。

3 个答案:

答案 0 :(得分:8)

该行邪恶

尽管如此,如果1mask[i],它会err[i] <= threshold分配给0

如果条件成立,则递增goodCount

mask[i] = (err[i] <= threshold);
goodCount += mask[i];

答案 1 :(得分:4)

所以你对这一行感到困惑:

goodCount += mask[i] = err[i] <= threshold;

您可以使用C运算符优先级表来确定此处的运算顺序,但无论如何它都是相当明确的:

  1. 将err [i]与阈值进行比较。这导致bool(真或假)。
  2. 将结果分配给mask [i]。我认为bool将在这里被转换为数字,对于true为1或对于false为0。
  3. 使用mask [i]的新值(这是=运算符的结果)来增加goodCount(基本上,goodCount将最终包含步骤1中找到的“true”值的计数)。
  4. 对我而言,该行最微妙的部分是赋值返回对左侧(即目标)的引用。这有时可以在一个不那么复杂的表达式中看到:

    if ((mem = malloc(42)) == NULL)
        throw ...
    

答案 2 :(得分:0)

goodCount += mask[i] = err[i] <= threshold;

在同一语句中混合分配和比较通常是一个坏主意。

推荐的方法是(1)知道所涉及的运算符的优先级,(2)将语句分成几个,以提高可读性。