Martwy kod przykład

W tym miejscu zadajemy pytania na temat języka C, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
StaryAnoda

Martwy kod przykład

Postautor: StaryAnoda » sobota 29 lip 2017, 13:50

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.

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Martwy kod przykład

Postautor: Antystatyczny » sobota 29 lip 2017, 14:03

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.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: Martwy kod przykład

Postautor: StaryAnoda » sobota 29 lip 2017, 18:04

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
}

Awatar użytkownika
tasza
Geek
Geek
Posty: 1082
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: Martwy kod przykład

Postautor: tasza » sobota 29 lip 2017, 18:23

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ą :)
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1168
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: Martwy kod przykład

Postautor: Antystatyczny » sobota 29 lip 2017, 18:26

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.
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

StaryAnoda

Re: Martwy kod przykład

Postautor: StaryAnoda » sobota 29 lip 2017, 18:27

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 :)

StaryAnoda

Re: Martwy kod przykład

Postautor: StaryAnoda » sobota 29 lip 2017, 18:42

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 :)


Wróć do „Pisanie programów w C”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość