Определение макроса в C с набором операторов - PullRequest
2 голосов
/ 26 февраля 2020

Я относительно новичок в программировании, и я пытался определить макрос с именем OPERATORS следующим образом:

#define OPERATORS {'+', '-','*', '/', '%', '^'}

Это с целью создания следующей программы:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define OPERATORS {'+', '-','*', '/', '%', '^'}

int isOperator (char c) {
    if(c!=OPERATORS)
        return 0;
    return 1;
}

int main(){
    printf("%d", isOperator('+'));
    printf("%d", isOperator('j'));
    return 0;
}

Чтобы узнать, является ли символ c оператором или нет. Но у меня были проблемы с компилятором, которые, я уверен, связаны с объявлением макроса. Итак, мой вопрос:

Как я могу определить макрос с набором операторов и как его использовать ?? «Потому что я почти уверен, что для сравнения переменной с макросом это должно быть сделано по-другому Извините за мое невежество и большое спасибо !!!

Ответы [ 2 ]

5 голосов
/ 26 февраля 2020

Макросы выполняют только текстовую подстановку, поэтому ваш код фактически эквивалентен следующему:

int isOperator (char c) {
    if (c != {'+', '-','*', '/', '%', '^'})
        return 0;

    return 1;
}

, что является недопустимым кодом C, вы не можете сравнить char с массивом символов, который не ' в любом случае это не имеет смысла.

Вы хотите это:

#include <stdio.h>
#include <stdlib.h>

int isOperator(char c) {
  static char operators[] = { '+', '-','*', '/', '%', '^' };
  for (int i = 0; i < sizeof operators; i++)
    if (c == operators[i])
      return 1;

  return 0;
}

int main() {
  printf("%d\n", isOperator('+'));
  printf("%d\n", isOperator('j'));
  return 0;
}

Или даже короче:

...
#include <string.h>
...
int isOperator(char c) {
  char operators[] = "+-*/%^";
  return strchr(operators, c) != NULL;
}
3 голосов
/ 26 февраля 2020

Юо также может использовать справочную таблицу

#include <stdint.h>

const int type[256] = {['%'] = 1, ['+'] = 1, ['-'] = 1, ['/'] = 1, ['*'] = 1, ['^'] = 1, ['!'] = 1, 
                       ['0'] = 2, ['1'] = 2, ['2'] = 2, ['3'] = 2, ['4'] = 2, ['5'] = 2, ['6'] = 2, ['7'] = 2, ['8'] = 2, ['9'] = 2,
};

int myisoperator(int c)
{
    return type[c] == 1;
}

int myisdigit(int c)
{
    return type[c] == 2;
}

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