我正在研究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;
我指示的线路实际上是做什么的?因为,叫我奇怪,我从未见过这样的事情。
供您参考:
CvModelEstimator2::findInliers
函数的一部分。答案 0 :(得分:8)
该行邪恶。
尽管如此,如果1
和mask[i]
,它会err[i] <= threshold
分配给0
。
如果条件成立,则递增goodCount
。
mask[i] = (err[i] <= threshold);
goodCount += mask[i];
答案 1 :(得分:4)
所以你对这一行感到困惑:
goodCount += mask[i] = err[i] <= threshold;
您可以使用C运算符优先级表来确定此处的运算顺序,但无论如何它都是相当明确的:
=
运算符的结果)来增加goodCount(基本上,goodCount将最终包含步骤1中找到的“true”值的计数)。 对我而言,该行最微妙的部分是赋值返回对左侧(即目标)的引用。这有时可以在一个不那么复杂的表达式中看到:
if ((mem = malloc(42)) == NULL)
throw ...
答案 2 :(得分:0)
goodCount += mask[i] = err[i] <= threshold;
在同一语句中混合分配和比较通常是一个坏主意。
推荐的方法是(1)知道所涉及的运算符的优先级,(2)将语句分成几个,以提高可读性。