Strona 1 z 1

Martwy kod przykład

: sobota 29 lip 2017, 13:50
autor: StaryAnoda
Hejka

Mam pytanie odnośnie jednego przykładu martwego kodu który znalazłem w książce.

Kod: Zaznacz cały

#include <stdio.h>
#include <string.h>

void loop (char *str);

int main (void)
{
   loop("STARYANODA");
   return 0;
}

void loop (char *str)
{
   size_t length = strlen(str);

   if(length == 0) return;

   for(size_t n = 0; n < length; n++)
   {
      if(str[n] == '\0')
      {
         printf("Ten kod nie zostanie uruchomiony 0 !!!");
      }
   }
   if(length)
   {
      printf("Ten kod nie zostanie uruchomiony  1 !!!");
      return;
   }
}


W konsoli otrzymuję komunikat: "Ten kod nie zostanie uruchomiony 1 !!!" co jest dla mnie zrozumiałem i oczywiste nie wiem dlaczego autor twierdzi, że ten kod nie zostanie wykonany.

Re: Martwy kod przykład

: sobota 29 lip 2017, 14:03
autor: Antystatyczny
Być może jest to jakiś błąd autora podczas kopiowania tekstu w treści programu. W Twoim przypadku długość tekstu jest większa od zera, dlatego:

Kod: Zaznacz cały

if(length)
   {
      printf("Ten kod nie zostanie uruchomiony  1 !!!");
      return;
   }
jest prawdą i efektem jest wyświetlenie napisu "Ten kod nie zostanie uruchomiony  1 !!!". Możliwe, że napis ma brzmieć "Ten kod zostanie uruchomiony 1 !!!". Trudno odgadnąć intencje autora widząc jedynie taki wycinek.

Re: Martwy kod przykład

: sobota 29 lip 2017, 18:04
autor: StaryAnoda
Chodzi mi o książkę której autorem jest Pete Goodliffe a nosi ona tytuł "Jak stać się lepszym programistą. Przewodnik"

Gdyby ktoś miał tą książkę to chodzi mi o kod na stronie 36:
A wygląda on dokładnie tak:

Kod: Zaznacz cały

void loop(char *str)
{
   size_t length = strlen(str);
   if (length == 0) return;
   for(size_t n = 0; n < length; n++)
   {
      if(str[n] == '\0')
      {
         //Ten kod nigdy nie jest wykonywany
      }
   }
   if(length) return;
   // Także ten kod nie zostanie uruchomiony
}

Re: Martwy kod przykład

: sobota 29 lip 2017, 18:23
autor: tasza
aaa, teraz to inaczej wygląda...

Kod: Zaznacz cały

if(length) return;
// Także ten kod nie zostanie uruchomiony

jest równoważne

Kod: Zaznacz cały

if(length) {
   return;  // tu konczymy
}
// Także ten kod nie zostanie uruchomiony, bo returnem wyjdzie wcześniej

... i return powyżej _zawsze_zadziała, bo skoro wcześniejszy warunek

Kod: Zaznacz cały

if (length == 0) return;

nie był prawdziwy, to length != 0, które jest jego negacją, automatycznie jest prawdą :)

Re: Martwy kod przykład

: sobota 29 lip 2017, 18:26
autor: Antystatyczny
Wszystko się zgadza. Program, po wejściu do funkcji loop(), zapisuje w zmiennej length długość przekazanego do niej tekstu. Następnie sprawdzana jest wartość tej zmiennej i jeśli length == 0, sterowanie zostaje zwrócone do funkcji nadrzędnej. Autorowi zapewne chodziło o to, by nie wciskać do funkcji kodu, który nigdy w życiu się nie wykona. Dlaczego się nie wykona? Funkcja strlen() zwraca długość tekstu nie uwzględniając znaku null na jego końcu, a zatem w Twoim przypadku w zmiennej length znajdzie się wartość 10. Skoro znak null nie jest uwzględniony, sprawdzanie w pętli for, czy str[n] == '\n' jest zupełnie bezcelowe, ponieważ pętla for zakończy swe działanie dokładnie na ostatniej literze tekstu. Pod pętlą jest jeszcze jeden warunek, który kończy działanie funkcji, gdy length != 0. Wszystko, co znajdzie się poniżej tego warunku, nie zostanie nigdy wykonane, ponieważ na początku funkcji masz warunkowe wyjście z funkcji, gdy length == 0, a tutaj warunkowe wyjście z funkcji, gdy length != 0. Nie ma więc możliwości, by nie spełnić jednego z tych warunków.

Re: Martwy kod przykład

: sobota 29 lip 2017, 18:27
autor: StaryAnoda
Tasza dzięki za wyjaśnienie, tak na poważnie to dopiero po przepisaniu tego kodu na forum zrozumiałem istotę mojego błędnego rozumowania.
Też zapomniałem dodać, że te printfy dodałem w celach edukacyjnych. Jeszcze raz dzięki :)

Re: Martwy kod przykład

: sobota 29 lip 2017, 18:42
autor: StaryAnoda
Anty też wielkie dzięki, wydawało mi się że ten komentarz dotyczy właśnie tego if-a

Kod: Zaznacz cały

if(length) return;


Dopiero po chwili zrozumiałem, że dotyczy kodu który znajduję się za nim :)