Funkcja , wskaźniki, co się dzieje w niej

0

Nie rozumiem w jaki sposób działa poniższa funkcja:
Czemu wynik zwraca 1? w szczególności nie rozumiem linijki z while ja to rozumiem tak że gdy wskaźnik tmp ustawiony zostanie na ostatnim elemencie napisu to zwrócone będzie 0.

Kompletnie nie rozumiem proszę o wyjaśnienie.I serdecznie dziękuje za pomoc w nauce.

 int fun (const char* str)
{
if(!*str)return 0 ;
const char * tmp =str+1;
while(*tmp++)
cout<<tmp;
return tmp-str-1;
}

Pozdrawiam

0
int fun (const char* str)   # pobierasz adres stringa
{
  if(!*str)return 0 ;                              # jeśli wartość zapisana pod tym adresem (pierwszego znaku) jest zerowa, to zwróć zero
  const char * tmp =str+1;                    # robimy nowy wskaźnik i ustawiamy go na drugi znak stringa (adres pierwszego znaku + 1 = adres drugiego znaku)
  while(*tmp++)                                  #dopóki wartość wskaźnika tmp jest niezerowa (po sprawdzeniu przesuń wskaźnik na następny znak)
    cout<<tmp;                                      #wykonuj: wypisuj stringa, na który wskazuje tmp (czyli od bajtu na który wskazuje aż do zero)
  return tmp-str-1;                               # zwróć długość słowa
}

czyli wypisuje wszystkie podsłowa, które kończą się wraz ze słowem, zaczynając od podsłowa o długości n-2 (czyli bez dwóch pierwszych znaków)
np. dla input:
fun("abcdefg\0");
jest output:
cdefgdefgefgfgg

0

a gdy NIE MA cout<<tmp; to zwraca 1 czemu?

0

a gdy NIE MA

 cout<<tmp;

to zwraca 1 czemu?

0

Bo wtedy jedyna instrukcja znajdująca się w pętli to return? o_O
Wstaw zamiast tego cout sam średnik na przykład...

0

na ćwiczeniach dostałem właśnie funkcje bez średnika i bez cout ....nie rozumiem skąd wartość jeden

0

generalnie wszystkie instrukcje sterujące typu if while itd. obejmują swoim zasięgiem następną instrukcję, która za nimi występuje - dokładnie jedną

teraz być może napiszę coś nie poprawnego jeśli chodzi o to czym jest '{', ale jeśli pierwszą instrukcją jest { to instrukcja sterująca obejmuje swoim zasięgiem cały blok instrukcji

w przeciwnym wypadku dokładnie jedną, więc jeśli usuniesz cout to pierwszą instrukcją po while jest return

0

Proponuje iść i gorzko zapłakać.

const char * tmp =str+1; //czyli tmp - str = 1
while(*tmp++) //czyli tmp jest o 1 większe, więc tmp-str = 2
  return tmp-str-1; //tmp-str-1= 1 i tyle wlaśnie zwracamy

Wiem wiem, to jest ciężka matematyka...
Proponuje zauważyć że pętla wykona się co najwyżej raz i od razu zostanie przerwana przez return.

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