Неверные операнды в двоичном - PullRequest
0 голосов
/ 28 июля 2010

У меня есть способ проверить, является ли число четным или нечетным:

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


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

однако всякий раз, когда я его компилирую, я получаю ошибку:

Invalid operands to binary %

Так что он компилируется в сборку как функция модуля и завершается с ошибкой, однако, если я использую функцию на основе модуля (возможно, медленнее), я получаю ту же ошибку!

Помогите мне переполнить стек

Спасибо - Олли

Ответы [ 5 ]

4 голосов
/ 28 июля 2010

x - указатель.Оператор по модулю не будет работать с указателями.

return (*x & 1);

Это разыменовывает указатель, а затем возвращает результат по модулю (неявно приведенный к BOOL)

1 голос
/ 28 июля 2010

Я подозреваю, что вы неправильно читаете сообщение об ошибке, и оно действительно говорит "Недопустимые операнды в двоичном &".

Причина, по которой это говорит о том, что "x" - указатель, поэтому вы должны сказать:

if (*x & 1)

не

if (x & 1)
0 голосов
/ 28 июля 2010
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) )

Работает просто отлично.

0 голосов
/ 28 июля 2010
return *x & 1;

Так как x является указателем на int, вам нужно сначала отложить его до начала.

В качестве альтернативы, вы можете изменить подпись на unsigned int.Я не вижу никакого преимущества в передаче указателя в этой ситуации.

0 голосов
/ 28 июля 2010

Это потому, что (кроме того факта, что ваш код содержит много опечаток) x определяется как указатель.Указатель не может иметь модуль, выполненный на нем, результат которого не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...