c++中IF循环的行为

IF loop behavior in c++

本文关键字:循环 IF c++      更新时间:2023-10-16

我需要在图像中找到一个像素与周围的8个像素相比是否具有最大值。

我不确定什么是最优的方式,所以我的想法是使用if语句如下:

if(pixel > pixel1 && pixel > pixel2 && pixel > pixel3 && ... && pixel> pixel8)

我的问题如下:如果它发现例如pixel不大于pixel1,它是否仍然检查语句的其余部分,或者因为它只有and,它将已经放弃指令并进一步执行?

如果答案是第一个,那么一直检查每个像素的计算量会非常大,谁能给我一个提示,如何更有效地解决这个简单的问题?

这叫做短路评估。

只有在第一个参数不足以确定表达式

的值时,才执行或计算第二个参数。

由于条件是&&,如果在任何条件下得到false,它将不会进一步检查

同样,如果条件是||,一旦发现true,它将停止检查。


顺便说一句,我不是绝对确定优先级规则,因此为了安全起见,我将每个条件都用括号括起来。

if((pixel > pixel1) && (pixel > pixel2) && ...

编辑:操作符优先级规则似乎表明,在这种情况下,括号是不必要的。

不,它不会检查其余的语句。c++"短路"条件语句,如果第一个操作数为假,则忽略第二个操作数为&&(如果第二个操作数为真,则忽略第二个操作数为||)。

操作符&&||是c++(以及大多数其他语言)中所谓的"短路操作符"。这意味着一旦可以确定结果,评估将立即停止。对于&&,这意味着如果其中一项是false,则其他项的求值将停止,因为这时的答案是false,与其他项无关。相反,对于||,这意味着如果有一项是true,则其他项的求值将停止。

不要认为它是一个级数,而是一组表达式,所以&&只有左右两边,并且是左结合的。

如果左侧求值为false,则标准保证不求右侧的值。右边甚至可能包含访问冲突(通常如此),例如,在左边检查指针是否为非空,然后在右边对其解引用。

您的操作最坏是O(N)。如果你这样做一次,这是最优的方式,如果你要这样做很多次,你最好找到你的像素的最大值,然后只是检查那个

c++中存在"short-circuit",即当第一个条件满足if时,第二个条件将不被检查。

例如,如果pixel > pixel1的结果是false,则忽略以下条件:

我建议你参考这个"短路评估"

虽然短路计算已经在其他答案中得到了解释,但值得指出的是,两个像素的比较可能不是完全微不足道的。例如,您可能希望在将红色,绿色和蓝色像素值乘以权重因子后添加它们(因为人眼对某些颜色比其他颜色更敏感)……在这种情况下,如果你不保留被比较对象内部的整体像素值(从而为该值使用更多内存并以某种方式跟踪它何时无效),+ CPU时间来检查&在必要时重新生成它),那么您将不得不在每次比较中执行此冗余计算。为了避免这种情况,您可以—例如—添加一个"get_brightness()"函数,该函数返回一个用户定义的类型,可以有效地与其他每个像素进行比较。