C 后缀求值中的数据类型转换

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的第

如果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,它也不会影响输出? [链接]


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 as
char 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?@Stack
char 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;
}