zla interpretacja kodu

0
    int rekur3(int);
    int main()
    { int n = 10, k, (*fptr)(int);
    fptr = rekur3;
    printf ("Wynik = %d\n", (*fptr)(0x14));
   
    
    }
    int rekur3(int n)
    { printf("Wywolanie z argumentem (%d)\n",n);
    if ( n <= 0) return n;
    else return ( rekur3 ( n - 3 >> 1) + n + 1 << 1);}
  
   
    }

Witam krótko opiszę moj problem w kodzie znajduje sie funckja rekur3 czy ktos moglby mi odpowiedziec na proste acz podchwytliwe pytanie ,dlaczego ta funkcja zwraca wynik= 94. Bo po mojemu powinien być inny. Wiem na 100% z pewnego źródła ze kompilator się nie myli.

1

Nie analizowałem co ta funkcja robi ale zgaduje że twój "błąd" polega na nieznajomości priorytetu operatorów. Wiesz co sie wykona wcześniej: przesuniecie bitowe << czy odejmowanie/dodawanie?

1

ja Ci napisze tak. Komuś musiało by się bardzo nudzić by w taki kod się wgryzać.

  1. nazwij zmienne lepiej
  2. bez takich dziwnych define. Zrob z tego prosta funkcje funkcje
  3. polepsz formatowanie
  4. zrob to tak ze mozna czytac jak normalne czytelne zdanie.
0

Postaw odpowiednio nawiasy w tej funkcji.

0

Tak mogłoby to być lepiej sformatowane fakt, ale nie chodzi mi tu o cały kod tylko o jego początek, w którym te makra nie maja udziału. Po tym komentarzu edytowałem moj post i usunalem czesc kodu, po funkcji rekur3, do ktorej nie odnosi sie moje pytanie. Najpierw dokonuje sie dodawanie odejmowanie potem przesuniecie bitowe po przesunieciu bitowym mozemy wykonywac dzialania | & ^ maja one mniejszy priorytet.

0

Postaw nawiasy, teraz masz tak:

(rekur3((n-3)>>1)+n+1)<<1
0

http://ideone.com/MOMUpO
na moje oko wszystko wykonuje sie poprawnie

rek(20) = (rek(8) + 21)*2 = (26+21)*2 = 94
rek(8) = (rek(2) + 9)*2 = (4+9)*2 = 26
rek(2) = (rek(-1) + 3)*2 = (-1 + 3)*2 = 4
rek(-1) = -1

Przy czym brałbym tu poprawkę na poleganiu na reprezentacji liczb i implementacji operacji bitowych, tzn te obliczenia bazują na tym co się stanie dla
-1 >> 1

W sumie jest to dość ciekawe bo spodziewałbym się że -1/2 da nam 0 a jednak -1 >> 1 daje w efekcie -1.

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2**E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.

Co by wyjaśniało czemu działa to trochę nie-intuicyjnie ;] To jest po prostu UB implementation-defined w tym przypadku.

http://www.viva64.com/en/d/0225/print/

0

rek(20) = (rek(8) + 21)*2 = (26+21)*2 = 94
rek(8) = (rek(2) + 9)*2 = (4+9)*2 = 26
rek(2) = (rek(-1) + 3)*2 = (-1 + 3)*2 = 4
rek(-1) = -1

Ok, ale dlaczego funkcja zwraca mi 94 i dlaczego wartosc rek(8) jest równa 26?

0

a co np w przypadku gdy bylo by rek(-2) jak mam wtedy postepowac?

0
bartosz94 napisał(a):

a co np w przypadku gdy bylo by rek(-2) jak mam wtedy postepowac?
Policzyć jeszcze raz nie może wyjść mniej niż -1

0
#define PRa(f,x) printf(#x"=%"#f";  ",(x))

#include <stdio.h>


int main()
{ 
  
  
      int n=27|40;
       ptr=rekur;    PRa(d,(*ptr)(n>>1+1));   
    
  
}

int rekur (int n)
{  static int k;  printf("Z%s; call %d; arg(%2d);\n","2",++k,n);
   if ( n <= -4 ) return n;
   else return (rekur(n-8 >> 1) + (n << 1+1)|2 >> 1);  }
0

Jak już wyżej powiedział @Shalom przesunięcie bitowe liczb ujemnych to operacja nie zdefiniowana przez standard.
Więc na jednym komputerze może być tak a na innym inaczej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1