logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pętla for statement with no effect

xamrex 09 Cze 2011 14:55 2218 11
  • #1 9593206
    xamrex
    Poziom 28  
    Mam taką funkcję:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    przy kompilacji dostaję warniga:
     warning: statement with no effect


    Natomiast jak zapiszę tę funkcję tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To warniga nie ma.
    Przecież każda funkcja wykonuje to samo, dlaczego więc przy pierwszej funkcji mam warninga?
  • Pomocny post
    #2 9593267
    GSM
    Poziom 25  
    Witam,

    kompilator jasno mówi co mu się nie podoba :roll: - x1 w sekcji inicjalizacji for'a.

    Pozdrawiam,
    GSM
  • Pomocny post
    #3 9593290
    michalko12
    Specjalista - Mikrokontrolery
    Wystarczy że zapiszesz
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    każdy składnik pętli for jest opcjonalny, tzn że żadnego może nie być.
  • #4 9593388
    xamrex
    Poziom 28  
    No,ok
    ale dlaczego ten zapis mój jest błędny?
    Czemu temu kompilatorowi mój x1 się nie podoba?
  • Pomocny post
    #6 9593446
    drzasiek
    Specjalista CNC
    W pierwszym argumencie pętli for deklarujesz zmienną albo przypisujesz wartość już zadeklarowanej zmiennej. A ty ani nie deklarujesz, ani nie przypisujesz więc kompilator warczy. Zrób tak jak ci pisał michalko12
  • Pomocny post
    #7 9593452
    tmf
    VIP Zasłużony dla elektroda
    Nie że mu się nie podoba - wypisuje to ostrzeżenie, bo sądzi, że to potencjalnie twoja pomyłka. Zapis for(x1;;) nic nie robi z x1, stąd kompilator tylko zwraca twoją uwagę pisząc, że taki zapis nie wpływa na x1 i żebyś sprawdził czy tak ma być (bez sensu), czy też może czegoś zapomniałeś i powinieneś to poprawić.
  • #8 9593485
    xamrex
    Poziom 28  
    Ok, dzięki za wyjaśnienie :)
  • Pomocny post
    #9 9595134
    GSM
    Poziom 25  
    Witam,

    michalko12 napisał:
    żadnego może nie być

    Chyba kolega miał na myśli każdego.

    dondu napisał:
    Sądzę, że dlatego, iż pokazujesz x1, ale nie deklarujesz jaką wartość ma mieć.

    Tu nie ma co sądzić, zresztą błędnie (lecz pośrednio prawidłowo), kompilator jasno informuje nas co jest przyczyną ostrzeżenia.

    drzasiek napisał:
    W pierwszym argumencie pętli for deklarujesz zmienną albo przypisujesz wartość już zadeklarowanej zmiennej.

    Ciepło.

    tmf napisał:
    Zapis for(x1; nic nie robi z x1, stąd kompilator tylko zwraca twoją uwagę pisząc, że taki zapis nie wpływa na x1 i żebyś sprawdził czy tak ma być (bez sensu), (...)

    Ten kolega wreszcie powiedział (prawie) całą prawdę :wink:

    Napisałem to dwa razy i napiszę trzeci: kompilator nam wyraźnie daje do zrozumienia co go trapi:
    warning: statement with no effect
    Ostrzega nas, że instrukcja (której zresztą jesteśmy autorami), nie ma żadnego efektu, wartość uzyskana w jej wyniku nie zostanie nigdzie przepisana ani nie zmieniamy w żaden sposób owej zmiennej - po to abyśmy byli tego świadomi, bo a nóż popełniliśmy jakąś literówkę.

    Co do samej pętli for, tak jak zauważył michalko12, wszystkie trzy parametry są opcjonalne, pisząc for( ; ; ) uzyskamy to samo co dzięki while(1) - pętle nieskończoną.
    Pierwszy parametr to inicjalizacja, ale nie musimy tam nic inicjalizować, ani zmiennych przypisywać, możemy sobie nawet jakąś funkcję wywołać - jest to po prostu sekcja która wykona się przed wejściem programu w pętle.
    Drugi parametr to wyrażenie testujące - warunek działania pętli, sprawdzany przed każdą iteracją.
    Trzeci parametr to wyrażenie licznikowe - wywoływane po każdej iteracji, jednakże możemy tu także zrobić co się nam żywnie podoba (tak jak i w przypadku pierwszego parametru).

    Apeluję więc do forumowiczów, nie szerzmy dezinformacji :!:
    Potem ktoś uczący się języka tu zajrzy i będzie tylko powielał niepełne/błędne informacje jakie tu nabędzie.

    Pozdrawiam,
    GSM

    P.S.
    Mam nadzieję, że nikt nie poczuł się po mojej wypowiedzi urażony - nie taki był jej cel.
    Jednocześnie proszę moderatora o usunięcie niepotrzebnych/mylących postów wg. uznania.
  • #10 9595252
    michalko12
    Specjalista - Mikrokontrolery
    GSM napisał:


    michalko12 napisał:
    żadnego może nie być

    Chyba kolega miał na myśli każdego.


    A kolega zna taki polski twór jak zasada podwójnego przeczenia?

    http://wszechnica.republika.pl/page6.html


    GSM napisał:
    pisząc for( ; ; ) uzyskamy to samo co dzięki while(1) - pętle nieskończoną.


    Wystarczy, że nie będzie środkowego parametru lub parametr ten będzie różny od zera i już będzie pętla nieskończona

    GSM napisał:
    Potem ktoś uczący się języka tu zajrzy i będzie tylko powielał niepełne/błędne informacje jakie tu nabędzie.

    No to jak juz tak dopełniałeś to czemu nie wspomniałeś o operatorze przecinkowym który można stosować w pierwszym i trzecim parametrze?
  • #11 9595328
    GSM
    Poziom 25  
    michalko12 napisał:

    Wystarczy, że nie będzie środkowego parametru lub parametr ten będzie różny od zera i już będzie pętla nieskończona

    Można to wywnioskować z mojej wypowiedzi.

    michalko12 napisał:

    No to jak juz tak dopełniałeś to czemu nie wspomniałeś o operatorze przecinkowym który można stosować w pierwszym i trzecim parametrze?

    Moim celem nie było opisywania w pełni rzeczonej pętli, tylko naświetlenie kilku drobnych acz istotnych szczegółów.

    Swoją drogą w głębi serca zastanawiałem się czy kolega sięgnie po argument o podwójnym przeczeniu i nie ukrywam, cieszę się, że tak się stało.
    Jednakże (jak zresztą strona z podanego linku zauważa), nie jest wskazane korzystanie z niego, gdyż może wprowadzić w błąd.

    A ten wątek nadaje się już tylko do zamknięcia.

    Pozdrawiam,
    GSM
  • #12 9595351
    xamrex
    Poziom 28  
    Też tak sądzę,
    Chyba już wszystko zostało powiedziane co miało być powiedziane

    Aby tutaj rozsądzić kolegów to zdanie napisane przez kolege michalko12
    michalko12 napisał:
    każdy składnik pętli for jest opcjonalny, tzn że żadnego może nie być.

    Nie przysporzyło mi żadnego problemu ze zrozumieniem go.
REKLAMA