2017-06-22 28 views
2

大家好,我试图从C语言编程书的问题由Brian W. Kernighan的(作者),丹尼斯·里奇M.(作者)。该手册提供的代码对于基本的逆波兰计算器,但我不明白#define NUMBER '0'如何与switch语句一起工作:C编程switch语句找到一个数字或字母

它如何能够捕获所有的数字,尽管我们没有每个数字的情况。接下来的问题还要求我处理像sincospow这样的案例。我假设也有类似的方式来做到这一点,但如果解释会帮助我更好。

getop得到下一个操作或数字操作数,pushpop是正规堆栈功能和atof将ASCII转换浮动。

#define NUMBER '0' 


    int type; 
    double op2; 
    char s[100]; 

    while ((type = getop(s)) != EOF) { 
     switch (type) { 
      case NUMBER: 
       push(atof(s)); 
       break; 
      case '+': 
       push(pop() + pop()); 
       break; 
      case '*': 
       push(pop() * pop()); 
       break; 
      case '-': 
       op2 = pop(); 
       push(pop() - op2); 
       break; 
      case '/': 
       op2 = pop(); 
       if (op2 != 0.0) 
        push(pop()/op2); 
       else 
        printf("error: zero divisor\n"); 
       break; 
      case '%': 
       op2 = pop(); 
       if (op2 != 0.0) 
        push((int)pop() % (int)op2); 
       else 
        printf("error: division by zero\n"); 
       break; 
      case '\n': 
       printf("\t%.8g\n", pop()); 
       break; 
      default: 
       printf("error: unknown command %s\n", s); 
       break; 
     } 
    } 
    return 0; 
} 
+2

我猜'getop()''返回如果NUMBER'其参数's'恰好是数字。 – Hasturkun

+0

看看'开关(类型)'行,直到启示来临。 –

+0

@Hasturkun是啊,我看到了什么发生了感谢。 – cv14

回答

2

的C预编译器读取并分析你的源代码之前执行文本替换。 NUMBER替换为'0',这是代表数字0的字符的值。

当从输入中分析数字并将数字复制到s时,函数getop()可能会返回值'0'atof()将其转换为数字。

如果你有机会为getop()的源代码,你会看到它是如何解析的数字,空格,注释和运营商。

注意,你不应该用浮点值使用%。您应该改用fmod()

+0

整数除法溢出不应该是一个问题,因为使用浮点运算... – Aconcagua

+0

@Aconcagua:OK,错过了。为什么麻烦测试零分区呢?将非零值除以零产生无穷大,0.0/0.0产生NaN。 – chqrlie

+0

数学正确性可能 - 不过,我错过了为%,确实是一个转换成int值做... – Aconcagua