← All posts tagged code

Тусуюсь тут с установкой Math::GSL в OSX.  Модуль очередной раз не установился. Читаю в логе выводы clang'а:

xs/FFT_wrap.1.15.c:6258:5: note: remove the 'if' if its condition is always false
    if ((items < 5) || (items > 5)) {
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

? code C

Есть грамотные сишные кодеры? Мне непонятно, почему Керниган и Ричи используют op2, когда можно не использовать. Или тут читабельность важнее? Но она и не особенно портится. Вот код (раздел 3.4 в книге):

   #include <stdio.h>
   #include <stdlib.h>  /* for  atof() */
   #define MAXOP   100  /* max size of operand or 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:
               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 ’\n’:
               printf("\t%.8g\n", pop());
               break;
           default:
               printf("error: unknown command %s\n", s);
break; }
}
return 0; }

В книге сказано, что первый pop() надо сохранять в отдельную переменную, чтобы сохранить правильный порядок операндов. Окей, но ведь можно вычитание и деление написать так (соответственно):

- pop() + pop() 
и 
1/pop() * pop()
и порядок будет в норме без лишней переменной. Или деление с дополнительным умножением получится дороже, чем присваивание op2?