Skocz do zawartości

Czy taki IF jest poprawny ? Kompilator głupieje, czy źle myślę...


PowerTGS440

Pomocna odpowiedź

Poniższy kod  ( powoduje zapalanie diody nr. 3 na wyświetlaczu LED&KEY) - wg. mnie porównanie jest poprawne, a żeby było śmieszniej w klamrach IFA w ogóle nie ma żadnej obsługi tej diody, magia...

 if( Minuta == 30 && Godzina % 2 ) 
 {
   // przechodzi przez kompilator ale, jakim cudem ? zapala mi diodę 
   // zwykła reszta z dzielenia, jesli godzina parzysta wejdz
 }

a gdy zamienię porównanie na takie
 

bool reszta_z_dzielenia = Godzina % 2;
if( Minuta == 30 && reszta_z_dzielenia ) 
 {
   // i tak się nic nie dzieje, jakim cudem w tamtem sposób
   // coś sięgało do adresu diody i ją zapalało 
 }

cudy z tym kompilatorem ARDUINO, czasami walczysz z kodem, szukasz ... a tu się coś wydarzyło nie kontrolowanego

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

12 minut temu, PowerTGS440 napisał:

wg. mnie porównanie jest poprawne

Oczywiście że jest poprawne. Pytasz jakim cudem? Po prostu: w C/C++ każde występujące w warunku wyrażenie które jest równoważne z jakimś intem (a więc również wskaźnik, który jest w sumie intem określającym adres) jest traktowane jako prawda (wyrażenie różne od zera) lub fałsz (wyrażenie równe zeru).

Czyli "Godzina % 2" da w wyniku albo zero (godzina parzysta) albo jeden (nieparzysta), i w związku z tym wyrażenie będzie prawdziwe dla godzin nieparzystych. Zapis zupełnie prawidłowy i bardzo często stosowany.

Oczywiście, można napisać "Godzina % 2 != 0", ale to wychodzi takie masło maślane. Tym niemniej również prawidłowe i również często stosowane (podobno dla większej czytelności).

Tak przy okazji: co się dzieje przy drugiej wersji i co się stanie, jeśli zmienna "reszta z dzielenia" będzie prawidłowego typu int a nie bool?

Przy okazji - Arduino nie ma żadnego "swojego kompilatora" (ani "swojego języka"). To zwykły C++ ze zwykłym kompilatorem GCC plus taki dodatkowy preprocesor, żeby leniuszki nie musiały np. void setup(void) tylko void setup() 🙂

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.