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
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
Dopiero po chwili zrozumiałem, że dotyczy kodu który znajduję się za nim
