[英]IF loop behavior in c++
我需要在图像中找到一个像素与其周围的8个像素相比具有最大值的情况。
我不确定什么是最佳方式,所以我的想法是使用if语句:
if(pixel > pixel1 && pixel > pixel2 && pixel > pixel3 && ... && pixel> pixel8)
我的问题如下:如果它发现例如像素不大于pixel1,它是否仍会检查语句的其余部分,或者因为它只是AND,它是否已经丢弃指令并进一步?
如果答案是第一个,这会使得每次检查每个像素的计算量非常大,有人可以给我一个暗示,如何更有效地处理这个简单的问题吗?
不,它不会检查其余的陈述。 C ++“短路”条件语句,如果第一个为假,则忽略&&
的第二个操作数(如果第二个为真,则忽略第二个操作数到||
)。
运算符&&
和||
是C ++中的所谓“短路运算符”(以及大多数其他语言)。 这意味着一旦确定结果,评估就会停止。 对于&&
,这意味着如果一个术语为false
,则其他术语的评估将停止,因为这样的答案是false
,与其他术语无关。 相反,对于||
这意味着如果一个术语true
,其他术语的评估将停止。 另见此链接 。
可以把它想象成一个系列而不是一组表达式,因此&&
只有左右两侧,并且左侧是关联的。
如果左侧评估为false
,则标准保证不评估右侧的内容。 右侧甚至可能包含访问冲突(通常也是如此),例如检查左侧的指针是否为非空,然后在右侧取消引用它。
你的操作最糟糕的是O(N)
。 如果你这样做一次,这是最好的方法,如果你要做很多事情,你最好找到你的像素的最大值然后只检查那个像素。
虽然在其他答案中已经解释了短路评估,但值得指出的是,两个像素的比较可能并非完全无关紧要。 例如,您可能希望在将它们乘以加权因子后添加红色,绿色和蓝色像素值(因为人眼对某些颜色比其他颜色更敏感)...在这种情况下,如果您不保留被比较对象内部的整体像素值(从而为该值使用更多内存并以某种方式跟踪它何时失效,+必要时检查并重新生成CPU时间),然后您必须在每个值期间执行此冗余计算那些比较。 为避免这种情况,您可以 - 例如 - 添加一个“get_brightness()”函数,该函数返回一个用户定义的类型,可以与其他每个像素进行有效比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.