[C] Priorytety i łączność operatorów

Chungu
Użytkownik
Użytkownik
Posty: 121
Rejestracja: 21 paź 2016, o 20:57
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 42 razy

[C] Priorytety i łączność operatorów

Post autor: Chungu »

Witam.
Próbuję uczyć się czystego C... Myślałem, że w miarę rozumiem priorytety i łączność operatorów ale jednak niezbyt... czy może ktoś mi wyjaśnić... krok po kroku (i najlepiej prostym językiem)
dlaczego takie "coś":
if(mm=4 || mm==6 || mm=11 && dd>30) jest niepoprawne...
natomiast to:
if((mm=4 || mm==6 || mm=11) && (dd>30)) jest już poprawne?
Dziękuję i pozdrawiam.
Ostatnio zmieniony 11 lis 2016, o 12:48 przez Chungu, łącznie zmieniany 2 razy.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Priorytety i łączność operatorów

Post autor: kalwi »

Żaden zapis nie jest poprawny.
Chungu
Użytkownik
Użytkownik
Posty: 121
Rejestracja: 21 paź 2016, o 20:57
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 42 razy

[C] Priorytety i łączność operatorów

Post autor: Chungu »

Hm... Dziwne... przykład pochodzi z książki Sextona "Język C-to proste" jednak już wcześniej zdarzało mi się znajdować w niej błędy... ;/ Zatem jak, i na jakiej zasadzie, powinno to być poprawnie? ;/
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Priorytety i łączność operatorów

Post autor: kalwi »

mm=11

Ten fragment jest źle.
Chungu
Użytkownik
Użytkownik
Posty: 121
Rejestracja: 21 paź 2016, o 20:57
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 42 razy

[C] Priorytety i łączność operatorów

Post autor: Chungu »

Faktycznie mój błąd... powinno być "==" ale tak poza tym... to co różni te 2 zapisy?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Priorytety i łączność operatorów

Post autor: kalwi »

a i mm=4 też jest nieprawidłowo

1)

Kod: Zaznacz cały

 mm==4 || mm==6 || mm==11 && dd>30
jest równoważne

Kod: Zaznacz cały

 mm==4 || mm==6 || (mm==11 && dd>30)
bo && ma wyższy priorytet niż ||

Czyli jeśli mm jest równe 4 lub 6 lub

Kod: Zaznacz cały

mm==11 && dd>30
to to będzie prawdą

Np dla

Kod: Zaznacz cały

mm=3
to nigdy nie będzie prawdą

2)

Kod: Zaznacz cały

(mm==4 || mm==6 || mm=11) && (dd>30))
A tu może być

Kod: Zaznacz cały

mm=3
i może zajść sytuacja, gdy to będzie spełnione, np. dla

Kod: Zaznacz cały

dd=31
Chungu
Użytkownik
Użytkownik
Posty: 121
Rejestracja: 21 paź 2016, o 20:57
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 42 razy

[C] Priorytety i łączność operatorów

Post autor: Chungu »

Dzięki, bardzo mi pomogłeś!!!
Jeszcze tylko jedno pytanko...
czy taki zapis:
((mm==4 || mm==6 || mm==11) && dd>30) jest poprawny?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C] Priorytety i łączność operatorów

Post autor: kalwi »

tak
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C] Priorytety i łączność operatorów

Post autor: Gouranga »

jeszcze tylko jeden detal, o którym warto pamiętać
if (a==4 || b>0)
jeśli a jest równe 4, to warunek b>0 nie zostanie w ogóle sprawdzony
if (a==4 && b>0)
jeśli a nie jest równe 4, to warunek b>0 też nie zostanie w ogóle sprawdzony
więc jeżeli masz takie złożone warunki i istnieje ryzyko, że gdzieś możesz mieć np. błędy alokacji w tablicach, wyjście za zakres itp. to lepiej te warunki, które stwarzają wyższe ryzyko błędu dać na początek i oczywiście przetestować we wszystkie możliwe strony, bo taki kod:

Kod: Zaznacz cały

int a = 4, tab[5];
if (a == 4 || tab[10] > 0){
...
}
mimo ewidentnego błędu przejdzie bez problemu i normalnie zadziała, dlatego chcąc być takim purystą języka C należałoby to poprawić na if (tab[10] > 0 || a == 4)
ODPOWIEDZ