C编程在if条件下传递函数

时间:2018-03-22 08:41:59

标签: c function callback

我正在编写简单的函数,它将可屏蔽的零和1数组返回到数字数组。

如果number是两个可屏蔽索引的幂,那么如果不是则为零。

没有通过我的简单函数isPower(),它工作正常,但是当我传递它时。奇怪的事情发生了。

我希望我的代码可以使用

if(isPower(nums[i])) 

没有或条件

#include<stdio.h>

int *isPowerOf2(int num, int*nums,int *result);
int isPower(int num);
int main(void)
{
int array[]= {1,2,2,4,4,3,4,3,3,4,4,4,4,4};
int size=0;
int *result=NULL;
result=isPowerOf2(14,array,&size);

for(int i=0; i<size; i++)
{
    printf("%i : %i\n",array[i],result[i]);
}
free(result);
printf("%i",size);
return 0 ;
}

int *isPowerOf2(int num, int*nums,int *result_num)
{
int *result=(int *)malloc(num*sizeof(int));

*result_num=num;
for(int i=0; i<num; ++i)
{
    if(isPower(nums[i])||!(nums[i]&nums[i]-1)) //this won't work  but when I use !(nums[i]&nums[i]-1) it works fine
    {
        result[i]=1;
    }
    else
    {
        result[i]=0;
    }

}
return result;
}

 int isPower(int var)
 {
 return ((var)&(var-1)==0)?1:0;
 }

2 个答案:

答案 0 :(得分:3)

在这种情况下,检查你实际计算的内容是值得的:

#include<stdio.h>

int main() {
    printf("%d %d\n",!(7&6),((7&6==0) ? 1 : 0)); //Not a power of 2
    printf("%d %d\n",!(8&7),((8&7==0) ? 1 : 0)); //Power of 2
    return 0;
}

返回:

0 0
1 0

如果你仔细想想,应该有意义。或者是吗? Operator precedence在这里杀了你。为什么右下角为0?

答案 1 :(得分:1)

祝福 (1&amp; 2)是按位操作数 (1&amp;&amp; 2)是逻辑操作数。

所以要明确: (1&amp; 2)== 0与!(1&amp; 2)完全不同。