Priorytety i łączność operatorów "czyste" C...

0

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.

3

Żadne z tych rzeczy "nie jest poprawne" na moje.
1.

if((mm=4 || mm==6 || mm=11) && (dd>30))

zamień na:

if((mm==4 || mm==6 || mm==11) && (dd>30))

subtelna różnica ALE, tam przypisujesz zamiast porównywać, mniemam, że to nie było zamierzone.

  1. Jeżeli chodzi o priorytety, to kolejność jak w matematyce, czyli AND przed OR.
0

Tak, już poprawiłem, mój błąd... ;/ Kurcze no niby wszystko jasne... mam nawet "tabelkę" z łącznością i priorytetami ale jakoś nadal nie rozumiem... :(

2

Oba te zapisy są poprawne, ale różnią się znaczeniem.

operator&& ma wyższy priorytet, więc następujące zapisy są identyczne:

a || b && c;
a || (b && c);
0

Faktycznie... pozbawiłem moje pytanie trochę kontekstu... chodzi o to żeby najpierw była obliczana wartość "całego" lub i porównania (dd>30) po czym całej koniunkcji... z tego co się orientuje operator "<" ma większy priorytet niż koniunkcja... zatem po co wyrażenie dd>30 jest w nawiasie? O.o

3

Może dla czytelności, nie zmienia to zupełnie działania.

0

z tego co się orientuje operator "<" ma większy priorytet niż koniunkcja

Mylisz pojęcia. Operatory < czy == zawsze są wykonywane na koncu. W twoim przypadku priorytety dotyczą operatorów łączących czyli && i ||.
&& zawsze ma wyższy priorytet niż ||.

Tak, już poprawiłem, mój błąd... ;/ Kurcze no niby wszystko jasne... mam nawet "tabelkę" z łącznością i priorytetami ale jakoś nadal nie rozumiem.

Tu nie ma filozofii, pomyśl o tym jak o działaniach na liczbach, przykładowo masz:
1 + 2 *3
jaki będzie wynik?
i teraz analogicznie
warunek1 || warunek2 && warunek3
priorytety jak w działaniu wyżej.

0

Jak nie...? O.o może zbyt mało ścisło się wysłowiłem... wyrażenie typu "a>b" (oczywiście bez " ") nie ma swojego priorytetu?? O.o Kurde, już naprawdę mi się miesza... w książce Pana Sextona "Język C-to proste" czy Panów Kernighana i Ritchiego jest o priorytecie operatora "< czy >" ... W każdym razie... już mniej więcej rozumiem... Dziękuje za wskazówki...
Jeszcze jedno pytanko-by się upewnić...
coś takiego:
((m==4||mm==6||mm==11)&&dd>30)jest poprawne?
Pozdrawiam...

0

Jak na końcu...? Kurczaki... a one nie mają wyższego priorytetu od operatorów logicznych? :o W każdym razie... to chyba prawie nic nie zmienia kiedy są obliczane... tutaj wszystko rozgrywa się o koniunkcje i alternatywe...

2

Wszystkie operatory mają priorytety. http://en.cppreference.com/w/cpp/language/operator_precedence ⟵ polecam cppreference jako referencję online zarówno do C jak i C++.

0

to co z tym wyrażeniem?? :)
((m==4||mm==6||mm==11)&&dd>30)jest poprawne?

2

Jest poprawne, tak jak oba z pierwszego posta. Ale zapewne pytałeś, czy będzie robiło to co chcesz. Na to pytanie również odpowiedź jest twierdząca. Będzie prawdziwe, jeśli m będzie miało jedną z trzech wybranych wartości oraz dd będzie większe od 30.

0

Wielkie dzięki!!! :D Pozdrawiam serdecznie!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1