二进制的操作数无效

时间:2010-07-28 17:24:55

标签: objective-c gcc assembly compiler-construction

我有一种检查天气数字是偶数还是奇数的方法:

   -(BOOL)numberIsEven:(unsigned int *)x {


  if (x & 1)
 {
  return TRUE;
 }
 else
{
 return FALSE;
  }
}

然而,每当我编译它时,我都会收到错误:

Invalid operands to binary %

因此,它正在将程序集编译为模数函数并且失败,但是如果我使用基于模数的函数(可以说更慢),我会得到相同的错误!

帮我堆叠溢出

谢谢 - 奥利

5 个答案:

答案 0 :(得分:4)

x是一个指针。模运算符不适用于指针。

return (*x & 1);

取消引用指针,然后返回模数的结果(隐含地转换为BOOL)

答案 1 :(得分:1)

我怀疑你错误地阅读了错误消息,它确实说“二进制和无效操作数”。

它说是“x”的原因是指针,所以你需要说:

if (*x & 1)

if (x & 1)

答案 2 :(得分:0)

那是因为(除了你的代码包含很多拼写错误这一事实)x被定义为指针。指针不能对其执行模数,其结果毫无意义。

答案 3 :(得分:0)

return *x & 1;

由于x是指向int的指针,因此您需要首先遵循它。

或者,您可以更改签名以获取unsigned int。在这种情况下,我认为传递指针没有任何好处。

答案 4 :(得分:0)

bool isOdd(unsigned int x) {
    return (bool)(x&1);
}

bool isOdd_by_ptr(unsigned int * p) {
    return isOdd( *p );
}

除非这实际上是C,否则你不会通过强制转换为bool获得任何东西。

#define IS_ODD( X ) (1 & (X) )

#define IS_ODD_BY_PTR( P ) (1 & *(P) )

工作得很好。