Ten artykuł zawiera kompleksowy samouczek, który pomoże Ci w nauce o asocjatywności i pierwszeństwie operatorów w języku C.
Pierwszeństwo operatorów w C
Priorytet operatora opisuje kolejność, w której ocenianych jest kilka operatorów podczas oceniania wyrażeń. Na przykład, jeśli wyrażenie zawiera zarówno operatory dodawania, jak i mnożenia, który z nich powinien zostać oceniony jako pierwszy? Odpowiedź jest prosta, C przestrzega pewnych zasad, aby rozwiązać taką niejednoznaczność, powszechnie znaną jako pierwszeństwo operatorów . w C, pierwszeństwo operatorów jest podzielony na 17 poziomów, od operatorów jednoargumentowych do trójskładnikowego operatora warunkowego. Większość używanych operatorów, takich jak operatory arytmetyczne, operatory relacji, operatory logiczne i operatory bitowe, jest zgodna ze standardem C pierwszeństwo operatorów protokół.
Precedens reguły określają, które operatory mają wyższy priorytet niż inne podczas obliczania wyrażeń. Kilka typów operatorów w języku programowania C ma różne stopnie precedens . Na przykład operatory jednoargumentowe mają wyższy priorytet niż operatory binarne. Poniżej znajduje się lista operatorów posortowana rosnąco precedens :
Operator | Znaczenie operatora | Asocjatywność |
() [] -> . |
Połączenie funkcjonalne Odwołanie do elementu tablicy Pośredni wybór członka Bezpośredni wybór członków |
Od lewej do prawej |
! ~ + – ++ — & * rozmiar (typ) |
Logiczna negacja Uzupełnienie bitowe (1’s). Jednoargumentowy plus Jednoargumentowy minus Przyrost Zmniejszenie Dereferencja (adres) Odniesienie do wskaźnika Zwraca rozmiar obiektu Typografia (konwersja) |
Od prawej do lewej |
* / % |
Zwielokrotniać Dzielić Reszta |
Od lewej do prawej |
+ – |
Binarny plus (dodatek) Minus binarny (odejmowanie) |
Od lewej do prawej |
<< >> |
Przesunięcie w lewo Przesunięcie w prawo |
Od lewej do prawej |
< <= > >= |
Mniej niż Mniejsze lub równe Lepszy niż Większe lub równe |
Od lewej do prawej |
== != |
Równy Nie równe |
Od lewej do prawej |
& | Bitowe ORAZ | Od lewej do prawej |
^ | Bitowe wyłączne LUB | Od lewej do prawej |
| | Bitowe LUB | Od lewej do prawej |
&& | Logiczne I | Od lewej do prawej |
|| | Logiczne LUB | Od lewej do prawej |
?: | Operator warunkowy | Od prawej do lewej |
= *= /= %= += -= &= ^= |= <<= >>= |
Proste zadanie Przypisz produkt Przypisz iloraz Przypisz resztę Przypisz sumę Przypisz różnicę Przypisz bitowe AND Przypisz bitowe XOR Przypisz bitowe LUB Przypisz lewe przesunięcie Przypisz prawe przesunięcie |
Od prawej do lewej |
, | Separator wyrażeń | Od lewej do prawej |
Te reguły kierują kompilatorem, jak oceniać wyrażenia z wieloma operatorami w tym samym wyrażeniu. Na przykład operator mnożenia ma wyższy priorytet niż operator dodawania w równaniu A + B * C, zgodnie z precedens zasady. Dlatego kompilator najpierw obliczy wyrażenie B * C przed dodaniem A do wyniku.
Spójrzmy na przykład pierwszeństwo operatorów poprzez kod.
#includeint główny ( ) {
int A = 43 , B = jedenaście , C = 16 , D = 31 ;
int wynik = ++ A * B -- + C / -- D ;
drukujf ( 'a = %d \N ' , A ) ;
drukujf ( 'b = %d \N ' , B ) ;
drukujf ( 'c = %d \N ' , C ) ;
drukujf ( 'd = %d \N ' , D ) ;
drukujf ( 'wynik = %d \N ' , wynik ) ;
powrót 0 ;
}
Cztery zmienne a, b, c i d są zadeklarowane w powyższym kodzie, a ich wartości początkowe to odpowiednio 43, 11, 16 i 31. Następnie stosuje różne operatory arytmetyczne i przypisania do tych zmiennych w wyrażeniu. Wyrażenie zwiększa wartość a za pomocą operatora preinkrementacji ++a, mnoży wynik przez operator postdekrementacji b–, a następnie dodaje wynik do dzielenia c przez wstępnie zmniejszoną wartość d. (używając operatora dekrementacji wstępnej –d). Zmienna result jest następnie używana do przechowywania całkowitego wyniku tego wyrażenia.
Wyjście
Asocjatywność w C
Asocjatywność odnosi się do kolejności, w jakiej operatory są oceniane podczas wyrażenia o tym samym priorytecie. Od lewej do prawej i od prawej do lewej asocjatywność to dwie formy asocjatywności w C. Jeśli dwa operatory mają to samo precedens , są one oceniane od lewej do prawej zgodnie z koncepcją od lewej do prawej asocjatywność . Niemniej jednak, jeśli obserwuje się ten sam priorytet, operatory są oceniane od prawej do lewej zgodnie z kolejnością od prawej do lewej asocjatywność .
Na przykład operator inkrementacji ++ ma zapis od prawej do lewej asocjatywność , co oznacza przyrost operator jest oceniany po zmiennej. Natomiast logiczne AND operator ma od lewej do prawej asocjatywność , co oznacza, że operator jest oceniany od lewej do prawej.
#includeint main() {
int a = 6 , b = 3 , do = 2 ;
int wynik = a * b / c;
printf( 'wynik = %d \N ' , wynik);
powrót 0 ;
}
Trzy zmienne a, b i c są zadeklarowane w tym kodzie i są inicjowane odpowiednio na 6, 3 i 2. Następnie stosuje operacje mnożenia i dzielenia do tych zmiennych w wyrażeniu. Mnożenie i dzielenie są uszeregowane od lewej do prawej w C na podstawie ich asocjatywność ponieważ mają ten sam poziom pierwszeństwa. Oznacza to, że podczas obliczania wyrażenia następuje operacja dzielenia, a po niej operacja mnożenia, a * b / c.
Wyjście
Wniosek
Priorytet operatora I asocjatywność to kluczowe pojęcia w programowaniu w C, które pomagają określić kolejność wykonywania wyrażeń. Operatorzy z najwyższą precedens poziom są oceniane jako pierwsze i asocjatywność reguły pomagają określić kolejność, gdy używanych jest wiele operatorów o tym samym priorytecie. Zrozumienie pierwszeństwo operatorów I asocjatywność jest niezbędny przy projektowaniu złożonych programów i pomaga tworzyć czystszy i wydajniejszy kod z mniejszą liczbą błędów.