Skocz do zawartości

Operatory logiczne w C na podstawie prostego programu - prośba o wyjaśnienie


abukkuba

Pomocna odpowiedź

Cześć, poniżej zamieszczam program, dla którego wiem (ale nie rozumiem dlaczego) wydrukowana na konsoli zostanie jedynie wartość 3 (więc spełniony jest tylko "else").

Czy mógłby mi ktoś bardzo łopatologicznie i krok po kroku wytłumaczyć co się dzieje zarówno przy "if" jak i "if else", że są one uznawane za niespełnione ?

Generalnie mam taki kłopot z tymi operatorami, że dla mnie w pewnym sensie to jest tylko jedna strona równania, drugiej nie widzę. Np. moje "rozumienie" poniżej:

if (zero ALBO nie-jeden) - i co z tego? do czego to odnieść ? z czym porównać?

else if (jeden I zero) - no tylko co z tego, że jeden i zero? co mi to mówi w kontekście programu? y oraz x mają dokładnie takie wartości, a jednak "2" nie jest drukowana.

 

 #include <stdio.h>

int main (){
   int x = 0, y = 1;
   if (x || !y)
      printf("1");
   else if (y && x)
      printf("2");
   else
      printf("3");
}

 

Pozdrawiam,

Kuba

Link do komentarza
Share on other sites

3 godziny temu, abukkuba napisał:

Cześć, poniżej zamieszczam program, dla którego wiem (ale nie rozumiem dlaczego) wydrukowana na konsoli zostanie jedynie wartość 3 (więc spełniony jest tylko "else").

Czy mógłby mi ktoś bardzo łopatologicznie i krok po kroku wytłumaczyć co się dzieje zarówno przy "if" jak i "if else", że są one uznawane za niespełnione ?

Generalnie mam taki kłopot z tymi operatorami, że dla mnie w pewnym sensie to jest tylko jedna strona równania, drugiej nie widzę. Np. moje "rozumienie" poniżej:

if (zero ALBO nie-jeden) - i co z tego? do czego to odnieść ? z czym porównać?

else if (jeden I zero) - no tylko co z tego, że jeden i zero? co mi to mówi w kontekście programu? y oraz x mają dokładnie takie wartości, a jednak "2" nie jest drukowana.

 

 #include <stdio.h>

int main (){
   int x = 0, y = 1;
   if (x || !y)
      printf("1");
   else if (y && x)
      printf("2");
   else
      printf("3");
}

 

Pozdrawiam,

Kuba

Ja to rozumiem tak:

if… x jest true, albo przeciwność y jest true to…, nie spełniony żaden warunek

else if… jeśli x i y są true to … , nie są oba naraz true, warunek nie spełniony

else… wyświetla 3 poprawnie

Jak się mylę, proszę o wyjaśnienie starszych kolegów.

 

Edytowano przez SOYER
  • Lubię! 2
Link do komentarza
Share on other sites

45 minut temu, abukkuba napisał:

i co z tego? do czego to odnieść ? z czym porównać?

Poczytaj sobie o logice (luknij w tabelę prawdy) AND, OR, NAD, NOR, XOR, NOT itp.

Dla logiki OR wystarczy że po lewej albo prawej stronie będziesz mieć wartość 1 aby warunek w funkcji został spełniony, natomiast dla AND po lewej i prawej stronie musisz mieć 1.  Alternatywnie możesz posługiwać się wartościami true, false gdzie true == 1, a false == 0. 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dla wyrażeń logicznych zero to fałsz, wszystko inne to prawda (a nie jakaś jedyna słuszna wartość 1).

Na przykład dla x==2:

if (x) ...

Wykona się bo warunek będzie spełniony, ale już

if (x == 1) ...
  

nie. O efektach ubocznych nie wspomnę, ale warto o nich pamiętać.

  • Lubię! 1
Link do komentarza
Share on other sites

2 godziny temu, rafal220 napisał:

Poczytaj sobie o logice (luknij w tabelę prawdy) AND, OR, NAD, NOR, XOR, NOT itp.

Dla logiki OR wystarczy że po lewej albo prawej stronie będziesz mieć wartość 1 aby warunek w funkcji został spełniony, natomiast dla AND po lewej i prawej stronie musisz mieć 1.  Alternatywnie możesz posługiwać się wartościami true, false gdzie true == 1, a false == 0. 

Powinno być(po mojej edycji):

„Poczytaj sobie o logice (luknij w tabelę prawdy) AND, OR, NAD, NOR, XOR, NOT itp.

Dla logiki OR wystarczy że po lewej albo prawej stronie będziesz mieć wartość RÓŻNĄ OD ZERO aby warunek w funkcji został spełniony, natomiast dla AND po lewej i prawej stronie musisz mieć WARTOŚĆ RÓŻNĄ OD ZERO.  Alternatywnie możesz posługiwać się wartościami true, false gdzie true != 0, a false == 0. „

Pytanie dla speców, jeśli będzie 

x = -1

if (x) spełniony czy nie?

Edytowano przez SOYER
Link do komentarza
Share on other sites

Przecież ja się tylko i wyłącznie odniosłem do przykładu na którym bazuje autor tematu. Czyli czystej logiki 0/1 Nic więcej. Gdyby brnąć w szczegóły, to przecież po lewej i prawej stronie operatora może się znajdować nawet całe działanie.  

Link do komentarza
Share on other sites

@abukkuba

Warunek 1) spełniony jeśli x ma wartość różną[true] od zera lub y równą[false] zero (ponieważ przed porównaniem y występuje negacja logiczna (!)
Warunek 2) spełniony jeśli x ma wartość różną[trueod zera i     y różną[true] od zero

Warunek 3) spełniony jeśli żadne z powyższych nie spełniony.

Może taki zmieniony zapis Ci pomoże
 

bool x = 0, y=1;

if((x == true) || (y == false)) // x == true OR y == false
{

}
else if((x == true) && (y == true)) // x == true AND y == true
{

}
else								
{

}  

 

  • Lubię! 2
Link do komentarza
Share on other sites

Dzięki serdeczne każdemu z Was za powyższe podpowiedzi, sporo mi się dzięki temu temat rozjaśnił. Już wiem, dlaczego w zadanym przykładzie mamy print wartości 3 dopiero przy "else".

Pozdr.

 

  • Lubię! 2
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.