我在看分支,我想避免循环分支,这基本上就是这样做的
for(z=0; z<8; z++){
if(0xff&&(array[z])!=0 ){
break;
}
}
所以我的计划实际上是用以下内容替换它:
for(z=0; z<8; z++){
(0xff&&(array[z])==0 ) ? continue : break;
}
但是,这行不通,我明白为什么,但想知道是否有另一种方法可以做到这一点,以类似的方式。
谢谢
我在看分支,我想避免循环分支,这基本上就是这样做的
for(z=0; z<8; z++){
if(0xff&&(array[z])!=0 ){
break;
}
}
所以我的计划实际上是用以下内容替换它:
for(z=0; z<8; z++){
(0xff&&(array[z])==0 ) ? continue : break;
}
但是,这行不通,我明白为什么,但想知道是否有另一种方法可以做到这一点,以类似的方式。
谢谢
您可以在 for 语句的终止条件(即 z<8)中包含中断条件。但是你不能避免分支;这只是一种不同的表达方式。
您对表达式的否定是错误的。
0xff&&(array[z])!=0
是true
什么时候0xff
是true
(这总是正确的)并且(array[z])!=0
是true
。
所以0xff&&(array[z])!=0
评估(array[z])!=0
否定给出的结果(array[z]==0)
所以你需要修改(0xff&&(array[z])==0 ) ? continue : break;
为(array[z]==0) ? continue : break;
怎么样:
int bits = 0;
for(z=0; z<8; z++) bits |= array[z];
if ((bits & 0xff) != 0) printf("Found it!\n");
上面只有一个额外的 if,而不是每个循环迭代一个。如果您的目标是使代码的执行速度更快,它可能会有所帮助,也可能不会。(我的猜测是,如果你在现代 CPU 上运行它不会有很大的不同)
使用 a?
仍然是一个分支,它只是另一种编写方式if
。由于您只有 8 个索引,因此您可以展开循环。
inline int getZ()
{
if (array[0] & 0xff) return 0;
if (array[1] & 0xff) return 1;
... and so on
}
作为旁注,您要使用&
按位运算符,而不是布尔&&
运算符,否则您的表达式将始终为真。
int z = 0;
while(z<8 && (0xff&&array[z]==0)) z++;
注意:也许您打算用 0xff 屏蔽数组 [z]?(即使用按位 & 运算符?)