繁体   English   中英

c ++中的IF循环行为

[英]IF loop behavior in c++

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

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

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

我的问题如下:如果它发现例如像素不大于pixel1,它是否仍会检查语句的其余部分,或者因为它只是AND,它是否已经丢弃指令并进一步?

如果答案是第一个,这会使得每次检查每个像素的计算量非常大,有人可以给我一个暗示,如何更有效地处理这个简单的问题吗?

这称为短路评估

如果第一个参数不足以确定表达式的值,则仅执行或计算第二个参数


由于条件是&& ,它不会进一步检查它是否在任何条件下都是false的。

同样,如果条件是|| ,一旦找到true就会停止检查。


顺便说一句,我并不完全确定优先规则,因此我会围绕括号中的每个条件只是为了安全。

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

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

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

在C ++中存在“短路”意味着当第一个条件满足时, if那么第二个条件将不被检查。

例如,如果pixel > pixel1结果为false ,则将忽略以下条件。

我推荐你这个“短路评估”

运算符&&|| 是C ++中的所谓“短路运算符”(以及大多数其他语言)。 这意味着一旦确定结果,评估就会停止。 对于&& ,这意味着如果一个术语为false ,则其他术语的评估将停止,因为这样的答案是false ,与其他术语无关。 相反,对于|| 这意味着如果一个术语true ,其他术语的评估将停止。 另见此链接

可以把它想象成一个系列而不是一组表达式,因此&&只有左右两侧,并且左侧是关联的。

如果左侧评估为false ,则标准保证不评估右侧的内容。 右侧甚至可能包含访问冲突(通常也是如此),例如检查左侧的指针是否为非空,然后在右侧取消引用它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM