Am următoarele fragmente de cod și am fost oarecum confuz de rezultat, pe baza cunoștințelor mele despre modul în care funcționează operatorii logici. Din câte știu (pe baza tabelelor de adevăr în electronică),
- Pentru
AND
logic,TRUE
șiTRUE
dau o valoare deTRUE
și toate celelalte combinații ale tabelului de adevăr daFALSE
. - Pentru
OR
logic, numaiFALSE
șiFALSE
oferă o valoare deFALSE
. În timp ce toate celelalte combinații ale tabelului de adevăr oferăTRUE
.
Pe baza acestor cunoștințe, acest prim fragment de cod-
void main( )
{
int i = -1, j = 1, k ,l ;
k = i && j ;
l = i || j ;
printf ( "%d %d\n", i, j ) ;
printf("%d %d", k,l);
}
oferă rezultatul -
-1 1
1 1
Sunt confuz aici, deoarece conform tabelelor de adevăr ale logice AND și OR, valoarea lui k ar trebui să fie -1. Aceasta provine din faptul că valoarea lui i
este -1
(care este FALSE
) și j
este 1
(care este TRUE
), deci TRUE
AND
FALSE
ar trebui să fie egal cu FALSE
, adică -1
.
Cu toate acestea, deoarece rezultatul a fost 1 pentru ambele k and l
, mă gândesc că C procesează AND
și OR
logic pe baza doar 1 și 0 unde 1 would be TRUE
și 0 would be false
. Conform acestei logici, orice valoare diferită de zero ar fi ADEVĂRAT, deci chiar și -1
ar fi TRUE
.
În acest caz, k=i&&j
ar însemna -1&&1
. Deoarece -1 și 1 sunt ambele ADEVĂRAT, deci expresia k= i&&j
evaluează la TRUE
, adică 1. Urmând aceeași logică, l=i||j
evaluează și la TRUE
.
Am dreptate când cred că a doua abordare este modul corect în care operatorii logici lucrează în C?
A doua mea întrebare este despre următorul fragment de cod -
void main( )
{
int j = 4, k ;
k = !5 && j ;
printf ( "\nk = %d", k ) ;
}
care produce ieșirea k=0
Acest lucru m-a încurcat într-adevăr, pentru că nu îmi pot da seama cum funcționează un NOT
logic într-un operator AND
logic. Aici j
este 4
, dar care este valoarea lui k
și cum se compară aceasta cu j
? Mă gândesc, deoarece k este not 5
, ar putea fi -5
? Dar, în acest caz, -5
și 4
evaluează ambele la TRUE
, deci valoarea lui k
ar trebui să fie 1
.
Te rog ajuta-ma.