C 流行音乐;推减除法

C 流行音乐;推减除法,c,stack,switch-statement,C,Stack,Switch Statement,我正在读K&R的C编程。所以,我遇到了pop&push。将某物推到堆栈上,然后从堆栈中弹出某物。本书中的计算器程序通常将两个弹出值相加、相乘,但问题出现在后面的情况下,即减法和除法。我读了这本书的解释。然而,这在我的脑海中产生了一点模糊。将弹出的值存储到另一个变量中有什么用,该值仍然保持不变。不是吗 我还有一个与主题无关的疑问:如果一个“0”的ASCII值为48,如果我们键入“8”。这两个字符的值不相同。那么,除了“0”之外,第一种情况在“1”到“9”之间的任何数字中都是真的 #include

我正在读K&R的C编程。所以,我遇到了pop&push。将某物推到堆栈上,然后从堆栈中弹出某物。本书中的计算器程序通常将两个弹出值相加、相乘,但问题出现在后面的情况下,即减法和除法。我读了这本书的解释。然而,这在我的脑海中产生了一点模糊。将弹出的值存储到另一个变量中有什么用,该值仍然保持不变。不是吗

我还有一个与主题无关的疑问:如果一个“0”的ASCII值为48,如果我们键入“8”。这两个字符的值不相同。那么,除了“0”之外,第一种情况在“1”到“9”之间的任何数字中都是真的

#include <stdio.h>
#include <stdlib.h>

#define MAXOP 100   /* max size of the operand & operator */
#define NUMBER '0'  /* signal that a number was found */

int getop(char []);  
void push(double);
double pop(void);

/*reverse polish calculator*/
main()
{
int type;
double op2;
char s[MAXOP];

while((type= getop(s)) != EOF) {      
switch (type) {

case NUMBER :      <------- case 1 '0' how would this case run if other than '0' ?
push(atof(s));
break;

case '+':
push(pop() + pop());
break;

case'*': 
push(pop() * pop());
break;

case '-':
op2= pop();
push(pop() - op2);
break;

case '/': 
op2= pop();
push(pop() / op2);
break;

/* there are printf statements and default statements so not writing those */
}
}
return 0;
}
#包括
#包括
#定义MAXOP 100/*操作数和运算符的最大大小*/
#定义数字“0”/*表示找到数字*/
int-getop(char[]);
空推(双);
双重弹出(无效);
/*反向抛光计算器*/
main()
{
int型;
双op2;
chars[MAXOP];
而((type=getop(s))!=EOF){
开关(类型){

案例编号:C标准没有规定算术操作数的求值顺序。因此,赋值是为了保证对非交换运算符
-
\
执行POP的顺序。对于交换运算符
+
*
,POP的顺序无关紧要,因此更简洁的代码肯定会起作用


关于
NUMBER
的问题,您必须学习
getop()的代码
。毫无疑问,如果在输入中发现任何数字,无论该数字是什么,它都会返回
'0'

这意味着如果从堆栈中取出3和4。我们必须将其中一个操作数赋给某个变量。这样我们就可以确保符号是负的或正的,即3-4=-1或4-3=1。是的。我们必须确保在nt来计算
3-4
这实际上是计算出来的,不是偶然的
4-3
。我搜索了很多,但找不到getop()用法…每次我搜索getop()时,我都会在谷歌上得到getopt()结果。@Gene你能告诉我在哪里可以阅读关于getop()的内容吗?getop是您正在学习的程序中的一个函数。它不是一个标准函数。oihh我看到了,我得到了它