Priorytet i kolejność obliczeń
Priorytet i łączność operatorów c wpływają na grupowanie i oceny operandy w wyrażeniach.Pierwszeństwo operatorów jest istotne tylko wtedy, gdy istnieją inne podmioty gospodarcze z wyższy lub niższy priorytet.Wyrażenia z operatorami wyższym priorytecie są sprawdzane jako pierwsze.Priorytet może także być opisane wyraz "wiązanie." Operatory o wyższym priorytecie są określane jako mieć większego powiązania.
W następującej tabeli podsumowano priorytet i łączność (kolejność, w którym są oceniane operandy) C. operatorów, aukcji je w kolejności od najwyższego do najniższego.W przypadku, gdy pojawią się razem kilka operatorów, mają równy priorytet i są oceniane zgodnie z ich łączność.Podmioty gospodarcze w tabeli są opisane w sekcjach, począwszy od Operatory przyrostkowe.Pozostałej części tej sekcji zawiera ogólne informacje na temat priorytet i łączność.
Priorytet i łączność operatorów c
Symbol1 |
Typ operacji |
Łączność |
---|---|---|
[ ] ( ) . -> przyrostkowe ++ i przyrostkowe — |
Wyrażenie |
Od lewej do prawej |
prefiks ++ i prefiks —sizeof & * + – ~! |
Jednoargumentowy |
Od prawej do lewej |
typecasts |
Jednoargumentowy |
Od prawej do lewej |
* / % |
Multiplikatywne |
Od lewej do prawej |
+ – |
Dodatek |
Od lewej do prawej |
<< >> |
Przesunięcie bitowe |
Od lewej do prawej |
< > <> = = |
Relacyjne |
Od lewej do prawej |
== != |
Równości |
Od lewej do prawej |
& |
Bitowe- I |
Od lewej do prawej |
^ |
Bitowe OR wyłączności |
Od lewej do prawej |
| |
Bitowe włącznie lub |
Od lewej do prawej |
& & |
Logiczne- I |
Od lewej do prawej |
|| |
Logiczne OR |
Od lewej do prawej |
?: |
Wyrażenie warunkowe |
Od prawej do lewej |
= *= /= %= += – = <> = = & = ^= |= |
Assignment2 prostych i złożonych |
Od prawej do lewej |
, |
Kolejne oceny |
Od lewej do prawej |
1.Operatory są przedstawione w kolejności malejącej.Jeżeli kilka operatorów pojawiają się w tym samym wierszu lub w grupie, mają równy priorytet.
2.Wszystkie operatory proste i mieszanek przypisania mają równy priorytet.
Wyrażenie może zawierać kilka operatorów z równy priorytet.Kiedy kilka takich podmiotów są wyświetlane na tym samym poziomie w wyrażeniu, oceny są kontynuowane zgodnie z łączność operatora, od prawej do lewej lub od lewej do prawej.Kierunek oceny nie wpływa na wyniki wyrażeń, które zawierają więcej niż jeden mnożenia (*), dodanie (+), lub operatory binarne (& | ^) operator na tym samym poziomie.Kolejność operacji nie jest zdefiniowany przez język.Kompilator jest bezpłatna do oceny takich wyrażeń w jakimkolwiek celu, jeśli kompilator może zagwarantować spójne wyniki.
Tylko sekwencyjny ocena (,), logiczne- I (& &), lub logiczne (||), wyrażenie warunkowe (? :), i operatorów wywołanie funkcji stanowią punkty sekwencji i dlatego zagwarantowanie określonej kolejności oceny ich operandów.Operator wywołanie funkcji jest zestaw w nawiasach, identyfikatorem funkcji.Operator oceny sekwencyjnych (,) jest gwarantowane do oceny argumentów od lewej do prawej.(Należy zauważyć, że operator przecinek w wywołaniu funkcji nie jest taka sama, jak operator kolejne oceny i nie zapewnia takiej gwarancji). Aby uzyskać więcej informacji, zobacz Punkty sekwencji.
Operatory logiczne również zagwarantować oceny ich operandy od lewej do prawej.Jednakże ich oceny najmniejszą liczbę operandy potrzebne do określenia wyniku wyrażenia.Jest to nazywane "zwarcie" oceny.Tak więc niektóre operandy wyrażenie nie mogą być oceniane.Na przykład w wyrażeniu
x && y++
drugi operand y++, jest oceniane tylko wtedy, gdy x jest true (niezerowej).W ten sposób y nie jest zwiększany, jeżeli x ma wartość false (0).
Przykłady
Na poniższej liście przedstawiono, jak kompilator automatycznie wiąże kilka przykładowe wyrażenia:
Wyrażenie |
Automatyczne powiązanie |
---|---|
a & b || c |
(a & b) || c |
a = b || c |
a = (b || c) |
q && r || s-- |
(q && r) || s–– |
W pierwszym wyrażeniu operatory- I operator (&) ma wyższy priorytet niż operator logiczny lub (||), tak a & b formularze pierwszego operandu operacja logiczna OR.
W wyrażeniu drugiego operatora logicznego OR (||) ma wyższy priorytet niż operator przypisania proste (=), tak b || c jest zgrupowane jako operand po prawej stronie, w przypisaniu.Należy zauważyć, że wartość przypisana do a jest równa 0 lub 1.
Trzecie wyrażenie zawiera poprawnie sformułowany wyrażenie, które może dać nieoczekiwane wyniki.Logiczne- I operator (&&) ma wyższy priorytet niż operatora logicznego OR (||), tak q && r jest zgrupowane jako operand.Ponieważ operatory logiczne gwarancji oceny operandy od lewej do prawej, q && r będzie oceniane przed s––.Jednakże jeśli q && r wynikiem jest wartość różną od zera, s–– nie jest sprawdzane i s nie jest zmniejszany.Jeśli nie zmniejszając s może spowodować problem w programie, s–– powinien być wyświetlany jako pierwszy argument Wyrażenie, lub s powinny być zmniejszany w osobnych operacji.
Następujące wyrażenie jest niedozwolona i produkuje diagnostyczne wiadomości w czasie kompilacji:
Niedozwolone wyrażenie |
Domyślne grupowanie |
---|---|
p == 0 ? p += 1: p += 2 |
( p == 0 ? p += 1 : p ) += 2 |
W tym wyrażeniu, operator równości (==), ma najwyższy priorytet, więc p == 0 jest zgrupowane jako operand.Operator wyrażenia warunkowe (? :) następny najwyższy priorytet.Jej pierwszy argument jest p == 0, a jej drugi operand jest p += 1.Jednakże ostatni argument operatora wyrażenie warunkowe uważana jest za p zamiast p += 2, od tego wystąpienia p ściślej wiąże operatorowi wyrażenie warunkowe niż z operatorem przypisania związek.Błąd składni występuje, ponieważ += 2 nie ma operand po lewej stronie.Należy używać nawiasów zapobiegania błędy tego rodzaju i produkują czytelność kodu.Na przykład można użyć nawiasów jak pokazano poniżej poprawiać i wyjaśnienia w poprzednim przykładzie:
( p == 0 ) ? ( p += 1 ) : ( p += 2 )