Проверьте или его символ или целое число - PullRequest
0 голосов
/ 02 марта 2011

это целочисленный массив:

int values[] = { 75, '*', 5,'-' };

for(i=0 ; i<size ; i++){
    // Here
}

как проверить, является ли values[i] целым числом или операцией ??

может быть значение равно Ascii операции, как с этим бороться в этом случае ??

Ответы [ 3 ]

8 голосов
/ 02 марта 2011

Вы не можете.Что касается компилятора, константы 42 и '*' - это одно и то же.В скомпилированном объектном коде они оба представлены как целое число 42.

Если вам нужно различать целые числа и символы, используйте либо логический флаг, либо перечисление, указывающее тип значения, или оставьте свои целыеи символы в отдельных массивах.

Обратите внимание, что в C ++, но не в C, есть небольшая разница: 42 имеет тип int, тогда как '*' имеетвведите char, чтобы вы могли различить этот факт, используя перегруженные функции или шаблоны.

4 голосов
/ 02 марта 2011

Это опасная дорога, чтобы идти вниз.Массив в вашем примере будет преобразован (во время компиляции) в:

int values[] = {75, 42, 5, 45};

Итак, когда вы видите число 42 ... что это?Это символ '*' или вы действительно имели в виду число 42?

Вы также не можете полагаться на приведение типов, поскольку все ваши значения будут преобразованы в int с, посколькухранятся в целочисленном массиве.Лучше всего создать структуру, которая будет содержать как тип, так и значение, например:

typedef struct
{
    int type;  //0 for int, 1 for operator, and so forth.
    int value; //holds either a character code or an integer value
    //you could use a union here, if you felt it would make things cleaner...
} Token;

Затем проверить, какой тип токена, - просто посмотреть на token.type.

Надеюсь, это поможет!

PS: Обманным ответом будет использование языка с динамической типизацией.С вашей стороны гораздо меньше работы, но медленнее, и я не знаю, подходит ли вам этот вариант.

0 голосов
/ 02 марта 2011

Ваши элементы массива не могут быть простыми целыми числами. Попробуйте вместо этого:

enum ElementType {INTEGER, OPERATION};
struct ArrayElement {
    enum ElementType etype;
    int evalue;
};
struct ArrayElement values[] = {
    {INTEGER, 75}, {OPERATION, '*'}, {INTEGER, 5}, {OPERATION, '-'}
};

for (i = 0; i < sizeof values / sizeof *values; i++) {
    /* Here */
    switch (values[i].etype) {
        default: printf("unrecognized type. value is %d.\n", values[i].value);
                 break;
        case INTEGER: printf("INTEGER with value %d.\n", values[i].value);
                      break;
        case OPERATION: printf("OPERATION with value '%c'.\n", values[i].value);
                        break;
    }
}
...