C 后缀求值中的数据类型转换
如果exp[i]是一个数字,那么为什么我们要在推送中传递exp[i]-“0”,但在运算符即val2运算符val1-“0”的情况下,我们不传递exp[i]-“0”。我想这与ascii有关,比如说我们想插入2,然后是字符2的ascii,在十进制中是字符0=2的ascii,我们把它放入堆栈中(这是int数组,但参数是char op),但如果它是一个运算符,我们就不会这样做。另外,如果我们在push中接收到第二个参数作为“char”op,那么为什么我们需要将其转换为ascii,并且如果我们在push的第二个参数中将char更改为int op,它也不会影响输出? [链接]C 后缀求值中的数据类型转换,c,C,如果exp[i]是一个数字,那么为什么我们要在推送中传递exp[i]-“0”,但在运算符即val2运算符val1-“0”的情况下,我们不传递exp[i]-“0”。我想这与ascii有关,比如说我们想插入2,然后是字符2的ascii,在十进制中是字符0=2的ascii,我们把它放入堆栈中(这是int数组,但参数是char op),但如果它是一个运算符,我们就不会这样做。另外,如果我们在push中接收到第二个参数作为“char”op,那么为什么我们需要将其转换为ascii,并且如果我们在push的第
char
变量根据相应的ASCII值保存字符
要将ASCII表示形式'1'
转换为整数值1
,需要从char
值中减去0
,['0'
]的ASCII值。然后可以对这些int
值执行算术运算,+
,*
或/
例如,'5'
的ASCII值为53。减去'0'
[48]的ASCII值,得到(53-48)=5,作为整数
这就是为什么,对于数字[注意使用isdigit(exp[i])
],要减去'0'
。但是,运算符不需要这样做,因为它们没有用作操作数
相关阅读:
如果exp[i]是一个数字,为什么我们要在推送中传递exp[i]-“0”
,但在运算符的情况下却不传递
这是因为digitChar-'0'
表达式的值是有意义的:它表示数字的数值,因为数字字符的数字代码是连续的。相反,从运算符中减去任何内容都不会给您带来任何好处,因为运算符的数字代码不是顺序的
另外,如果我们在push aschar op
中接收到第二个参数,那么为什么需要将其转换为ascii
我们不会-op
保留系统使用的相同编码
如果我们在push的第二个参数中将char改为int op,它也不会影响输出
它之所以有效,是因为我们使用
char op
作为它的数值。当您在结构堆栈
中对数组
赋值时,编译器将int
转换为数组
的元素类型,因此没有区别。char p=2;int a=c;printf(“%d”,a)prints 2您能解释一下它是如何工作的吗bcoz 2(而不是“2”)不是一个字符,但我们正在将它分配给一个字符?@stack use'2'
并检查::-)@对于char,格式说明符是%c
我知道我只是在检查如果我们给一个char分配一个整数值,它是如何计算的(例如,我们是采用ascii值2还是什么)?另外,如果我们将c赋值给一个整数,并使用%d打印int a,它将打印出2。@Stack让我给你一个简单的例子,假设char c=9
,然后使用%d
它将打印9
,使用%c
它将打印选项卡
[空白]。OTOH,char c='9'
,使用%d
它将打印57
,使用%c
它将打印9
。希望现在一切都清楚了。:-)字符c[]={1,2,3,4};int z=c[1]-“0”;printf(“%d”,z);它打印-46,但你说digitchar-'0'应该给我们数值,在这种情况下,它应该给我们2(50-48)@堆栈,这不是我说的。我说如果你做charc[]={'1','2','3','4'}代码>您将获得数值<代码>{1,2,3,4}
在您的示例中不是数字字符代码(它们甚至不能在许多系统上打印)。对于结构,编译器会隐式转换它。。从输入数组中,当我们传递exp[1]而不传递-'0'时,它是否计算为50,exp[1]='1'或1?@Stackchar exp[]=“231*+9-”
是char exp[]={'2'、'3'、'1'、'*'、'+'、'9'、'-'、'\0'}
的较短等价物。试一试。如果我们想计算两位数或三位数呢?我在输入数组中包含空格btn运算符和操作数[20 30 10*+90-]的值应为230,但它的值为0
void push(struct Stack* stack, char op)
{
stack->array[++stack->top] = op;
}
int evaluatePostfix(char* exp)
{
struct Stack* stack = createStack(strlen(exp));
int i;
if (!stack) return -1;
for (i = 0; exp[i]; ++i)
{
// If the scanned character is an operand or number,
// push it to the stack.
if (isdigit(exp[i]))
push(stack, exp[i] - '0');
// If the scanned character is an operator, pop two
// elements from stack apply the operator
else
{
int val1 = pop(stack);
int val2 = pop(stack);
switch (exp[i])
{
case '+': push(stack, val2 + val1); break;
case '-': push(stack, val2 - val1); break;
case '*': push(stack, val2 * val1); break;
case '/': push(stack, val2/val1); break;
}
}
}
return pop(stack);
}
int main()
{
char exp[] = "231*+9-";
printf ("Value of %s is %d", exp, evaluatePostfix(exp));
return 0;
}