Удивительный вывод программы на C при использовании '*' для умножения
После решения упражнения 5-10 в K & R:
Напишите программу expr, которая вычисляет обратное польское выражение из командной строки, где каждый оператор или операнд является отдельным аргументом. Например, expr 2 3 4 + * оценивает 2 * (3 + 4).
Похоже, проблема в выражениях с символом «*», даже в таких, как: 2 2 *. По какой-то странной причине '*' не помещается воператор массив, в то время как все другие символы, такие как '+', '-', '/' обычно являются. Я выделил ту часть кода (цикл while), которая кажется неправильной. Функция Push - из главы 4, и она необходима только для компиляции кода.
#include <stdio.h>
void push(double f);
main(int argc, char *argv[])
{
int a = 0;
int b;
char operator[10];
while (--argc > 0) {
if (isdigit(*argv[argc]))
push(atof(argv[argc]));
else if (*argv[argc]=='+' || *argv[argc]=='-' || *argv[argc]=='*' || *argv[argc]=='/')
operator[a++] = *argv[argc];
}
for (b = 0; b < a; b++)
printf("%c", operator[b]);
printf("\n");
return 0;
}
#define MAXVAL 100 /* maximum depth of val stack */
int sp = 0; /* next free stack position */
double val[MAXVAL]; /* value stack */
/* push: push f onto value stack */
void push(double f)
{
if (sp < MAXVAL)
val[sp++] = f;
else
printf("error: stack full, can't push %g\n", f);
}
Выход
[user@machine Desktop]$ ./prog + +
++
[user@machine Desktop]$ ./prog *
[user@machine Desktop]$ ./prog * *
[user@machine Desktop]$ ./prog + / * -
-/+