这是一个整数数组:
int values[] = { 75, '*', 5,'-' };
for(i=0 ; i<size ; i++){
// Here
}
如何检查 values[i]
是整数还是操作?
也许该值等于操作的Ascii,在这种情况下如何处理它?</ p>
答案 0 :(得分:8)
你做不到。就编译器而言,常量42
和'*'
是同一个。在编译的目标代码中,它们都表示为整数42。
如果需要区分整数和字符,可以使用布尔标志或枚举来指示值的类型,或者将整数和字符保存在单独的数组中。
请注意,在C ++中,但C中的不是,存在细微差别:42
的类型为int
,而'*'
的类型为char
{1}},因此您可以使用重载的函数或模板来区分这一事实。
答案 1 :(得分:4)
这是一条危险的道路。示例中的数组将(在编译期间)转换为:
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:作弊的答案是使用动态类型的语言。您的工作量较少,但速度较慢,而且我不知道它是否适合您。
答案 2 :(得分:0)
您的数组元素不能是简单的整数。 试试这个:
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;
}
}