这是一个整数数组:
int values[] = { 75, '*', 5,'-' };
for(i=0 ; i<size ; i++){
// Here
}
如何检查values[i]
是整数还是操作??
也许这个值等于一个操作的Ascii,在这种情况下该如何处理呢?
发布于 2011-03-01 21:31:48
这是一条危险的道路。示例中的数组将(在编译期间)转换为:
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:作弊的答案是使用动态类型的语言。你的工作少了很多,但速度慢了,我不知道这是否是你的选择。
发布于 2011-03-01 21:22:29
就编译器而言,常量42
和'*'
是相同的。在编译的对象代码中,它们都表示为整数42。
如果需要区分整数和字符,可以使用布尔标志或枚举表示值的类型,或者将整数和字符保持在单独的数组中。
注意,在C++中,但在C中,有一个细微的区别:42
有类型int
,而'*'
有类型char
,所以可以使用重载函数或模板来区分这一事实。
发布于 2011-03-01 21:43:34
数组元素不能是简单整数。试一试:
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;
}
}
https://stackoverflow.com/questions/5160468
复制相似问题