【问题标题】:Invalid operands to binary二进制操作数无效
【发布时间】:2010-07-28 17:24:55
【问题描述】:

我有一种方法可以检查一个数字是偶数还是奇数:

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


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

但是每当我编译它时,我都会收到错误:

Invalid operands to binary %

所以它作为模数函数编译成程序集并以某种方式失败,但是如果我使用基于模数的函数(可以说更慢),我会得到同样的错误!

帮我堆栈溢出

谢谢 - 奥利

【问题讨论】:

  • if (isTrue) { return true; } else { return false; } 范式。哦,男孩。
  • 抛开所有其他问题,当你修复不取消引用指针的错误时,你的方法名真的很垃圾,因为如果 *x 是奇数,它将返回 true。
  • 能贴出真实的代码和错误信息吗?您发布的内容显然是错误的。

标签: objective-c gcc assembly compiler-construction


【解决方案1】:

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

return (*x & 1);

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

【讨论】:

    【解决方案2】:

    我怀疑您读错了错误消息,它确实显示“二进制 & 的操作数无效”。

    之所以说“x”是一个指针,所以你需要说:

    if (*x & 1)
    

    不是

    if (x & 1)
    

    【讨论】:

      【解决方案3】:

      那是因为(除了您的代码包含许多拼写错误之外)x 被定义为一个指针。指针不能对其进行取模,其结果是没有意义的。

      【讨论】:

        【解决方案4】:
        return *x & 1;
        

        由于x 是一个指向int 的指针,所以你需要先尊重它。

        或者,您可以更改签名以采用unsigned int。我看不出在这种情况下传递指针有什么好处。

        【讨论】:

          【解决方案5】:
          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) )
          

          工作正常。

          【讨论】:

          • 这里有一些有趣的尝试:bool isOdd(int x) { return !isEven(x); }, bool isEven(int x) { return !isodd(x); } =D
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-31
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          相关资源
          最近更新 更多