Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的IF循环行为+;_C++_Loops_If Statement_Max - Fatal编程技术网

C++ c+中的IF循环行为+;

C++ c+中的IF循环行为+;,c++,loops,if-statement,max,C++,Loops,If Statement,Max,我需要在一幅图像中找出一个像素与周围的8个像素相比是否具有最大值 我不确定什么是最佳方式,因此我的想法是使用if语句,如下所示: if(pixel > pixel1 && pixel > pixel2 && pixel > pixel3 && ... && pixel> pixel8) 我的问题是:如果它发现例如pixel不大于pixel1,它还会检查语句的其余部分吗?或者因为它只是ANDs,它会放弃指令并

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

我不确定什么是最佳方式,因此我的想法是使用if语句,如下所示:

if(pixel > pixel1 && pixel > pixel2 && pixel > pixel3 && ... && pixel> pixel8)
我的问题是:如果它发现例如pixel不大于pixel1,它还会检查语句的其余部分吗?或者因为它只是ANDs,它会放弃指令并继续吗

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

仅当第一个参数不足以确定表达式的值时,才执行或计算第二个参数


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

类似地,如果条件为
|
,则一旦找到
true
,它将停止检查


顺便说一句,我不是绝对肯定的优先规则,正因为如此,我将包围在括号中的每个条件只是为了安全

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

编辑:规则似乎表明本例中的括号是不必要的。

不,它不会检查其余语句。C++“短路”条件语句,如果第一个为false,忽略第二个操作数,如果第一个为false(第二个操作数忽略了<代码> >代码>第二个为真。)/P> < P> > C++中“短路”,即当第一个条件满足<代码>如果< /代码>,则第二个条件将不被检查。 例如,如果
pixel>pixel1
results
false
以下条件将被忽略


>我指的是这个< /P> < P>运算符<代码> & & <代码>和<代码> <代码>是C++中所谓的“短路操作符”(以及大多数其他语言)。这意味着评估将在确定结果后立即停止。对于
&&
,这意味着如果一个术语为
,则其他术语的计算将停止,因为此时答案为
,与其他术语无关。相反,对于
|
而言,这意味着如果一个术语为
,则其他术语的计算将停止。
另请参见。

不要将其视为一个系列,而是一组表达式,因此
&&
只有一个左侧和右侧,并且是左侧关联的

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


最坏情况下,您的操作是
O(N)
。如果你这样做一次,这是最好的方法。如果你要经常这样做,你最好先找到像素的最大值,然后再对照这个值进行检查。

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

啊,不管怎样,我确实使用了括号,我没有想到要重写它们作为示例。:)感谢您提供非常有用和清晰的答案!他的优先级是正确的,>优先于&。不过,加上额外的括号确实会使代码更容易理解,而不会增加任何额外的编译器开销。@CashCow是的,这就是为什么我在计算出来时添加了一个编辑而不是删除整个内容的原因。您可能正在查找
if(pixel>*max_元素(&pixel[0],&pixel[7])
。看,谢谢!听起来更有效你真的有18个独立的完全相同的变量吗?如果是这样的话,问题更多的是数据设计,而不是&&本身!不是18,必须将“像素”的“l”与“1”混淆。数据是比较图像中相邻像素的像素谢谢,关于这些我都知道。这只是一般的方法,我不知道怎么做。另外,在我的例子中,我有灰度图像,所以只有一个通道。