Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

czwartek, 10 lutego 2011

Kurs języka C: Operator warunkowy ... ? ... : ...;


Autor: Dondu

Kurs języka C: Spis treści

Operator warunkowy jest operatorem trójelementowym składającym się z warunku i dwóch wartości. Operator ten zwraca:
  • wartość pierwszą, gdy warunek jest spełniony,
  • wartość drugą, gdy warunek nie jest spełniony,

  wynik = warunek ? wartosc1 : wartosc2 ;

Operator warunkowy odpowiada instrukcji :

  if(warunek)  wynik = wartosc1;  //gdy warunek jest spełniony
  else         wynik = wartosc2;  //gdy warunek nie jest spełniony

lub zapisując inaczej:

  if(warunek){
    //gdy warunek jest spełniony
    wynik = wartosc1;
  }else{
    //gdy warunek nie jest spełniony
    wynik = wartosc2;
  }

Jak widać powyżej, operator warunkowy pozwala w prostych przypadkach na zapisanie w jednej linii kodu działania zależnego od wyniku badania warunku.


Przykład 1 (w kompilatorze)
  int wynik;
  int warunek=1;  //symulujemy spełniony warunek
  
  wynik = warunek ? 100 : 200;

Sprawdź przykład w kompilatorze CManiak. Zobacz także, co się stanie gdy zmienisz wartość warunku na zero.

Dane mogą być definicją, stałą, zmienną lub wyrażeniem.

Przykład 2 (w kompilatorze)
  #define ilosc 1000
  const int c = 91;
  int a=8, b=9;

  wynik = warunek ? ilosc*a-c*b : b+c ;
Przetestuj powyższy kod w kompilatorze CManiak.


W przeciwieństwie do instrukcji if( ) operator warunkowy ? nie może zawierać bezpośredniego wykonania instrukcji przypisania, czyli nie jest możliwe takie wykorzystanie operatora:

Przykład 3 (w kompilatorze)
  warunek ? wynik=100 : wynik=200;  //nieprawidłowe wykorzystanie operatora

Ale wystarczy zastosować nawiasy i już mamy możliwość wykorzystania operatora w taki sposób:

Przykład 4 (w kompilatorze)
  warunek ? (wynik=100) : (wynik=200);  //prawidłowe wykorzystanie operatora


Możliwe jest także wykorzystanie innych operatorów zmieniających stan zmiennych np. operatorów inkrementacji i dekrementacji. W tym wypadku nie trzeba stosować nawiasów.

Przykład 5 (w kompilatorze)
  warunek ? ++wynik : --wynik;

Zauważ, że w przykładach 3, 4 i 5 nie wykorzystujemy wartości zwracanej przez operator warunkowy, a jedynie ustawiamy zmienne. Ale nic nie stoi na przeszkodzie, by wartość zwracaną wykorzystać:

Przykład 6 (w kompilatorze)
  wynik = warunek ? (a=100) : (a=200);
Wtedy oprócz ustawienia zmiennej a, ustawimy zarazem zmienną wynik. Sprawdź w kompilatorze jak to działa.


Można także wykorzystywać funkcje.

Przykład 7 (w kompilatorze)
  wynik = warunek ? jakas_funkcja() : wartosc2;
}

I znowu zapraszam do kompilatora CManiak, gdzie pobawisz się z tym przykładem oraz pozostałymi.

Kurs języka C: Spis treści

24
Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

4 komentarze:

  1. "W przeciwieństwie do instrukcji if( ) operator warunkowy ? nie może zawierać wykonania instrukcji przypisania, czyli nie jest możliwe takie wykorzystanie operatora".

    Aby na pewno? Z tego co mi się wydaje (i kod w dostępnym tu kompilatorze potwierdził) wystarczy przypisanie wziąć w nawias i się kompiluje, jak powinno.

    warunek ? (wynik=100) : (wynik=200);


    Powodem takiego działania będzie fakt, że operator ?: ma ciut wyższy priorytet od wszelkiego typu przypisań (i dobrze, bo w przeciwnym wypadku nie działałby kod w stylu:

    wynik = warunek ? 100 : 200;

    (do wyniku byłaby przypisywana wartość warunku), tylko musiałby być zapisywany jako:

    wynik = (warunek ? 100 : 200);

    a tak, można nawias pominąć).

    OdpowiedzUsuń
  2. Tak masz rację, dodanie nawiasów umożliwia wykonanie operacji przypisania. Zaraz dopiszę ten przypadek - dziękuję za zwrócenie uwagi.

    OdpowiedzUsuń
  3. chyba w przykładzie 5 w cmaniaku brakuje "wynik= warunek ?..."

    OdpowiedzUsuń
    Odpowiedzi
    1. Był błąd, ale inny. Ten przykład pokazuje jak wykorzystać operator warunkowy znaku zapytania do operacji na zmiennych, a nie przypisywaniu wyniku. Przykład poprawiony zarówno w tekście artykułu jak i CManiaku. Dziękuję za zwrócenie uwagi!
      Pozdrawiam,
      Jacek

      Usuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.