c++中IF循环的行为
IF loop behavior in c++
我需要在图像中找到一个像素与周围的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()"函数,该函数返回一个用户定义的类型,可以有效地与其他每个像素进行比较。
- 具有嵌套 if-else 的循环的时间复杂度
- do while 循环中的 if 语句以 yes 或 no 结尾
- 如何在C++中创建 if else 循环而不是多个嵌套?
- 什么可以用来替换代码中的循环和 if 语句?
- C++ 访问 if 语句(如果它们在 for 循环中)
- 试图避免在 for 循环中出现 if-else 语句,但代码似乎有一些错误
- 如何仅在父循环的所有迭代都为真时才执行嵌套的 if 语句?
- 这个 FOR-IF 循环的解释是什么?
- 为什么这个 IF 语句在循环内不打印
- 为什么循环没有中断,并且 if 条件没有按预期工作?
- 当我的 if 语句在字符串中找到空格时,在无限循环中切换
- 我的 if 语句打印在我的 while 循环中的每个 if 语句上,无论它是否为假
- C++-循环中的If语句工作不正常
- 在C++中做一个场景问题,我不确定如何处理布尔和if循环
- While循环和if/else语句工作不正常
- C++ |如何循环 If 语句而不每次都返回值
- 如何优化循环/if语句的C
- 如何运行代码循环 if (a==b) 并且不循环如果 a != b 没有"else"
- 检测循环/if括号后的分号
- C++ 在循环"if"内丢失赋值的变量