Cum diferă operatorii logici din C de operațiile logice reale? [duplicat]

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ă),

  1. Pentru AND logic, TRUE și TRUE dau o valoare de TRUE și toate celelalte combinații ale tabelului de adevăr da FALSE.
  2. Pentru OR logic, numai FALSE și FALSE oferă o valoare de FALSE. Î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.


person Manish Giri    schedule 21.07.2014    source sursă
comment
presupunerea ta este incorectă. orice valoare diferită de zero din C este adevărată și zero este falsă, care include -1 (tratată ca adevărată)   -  person Ahmed Masud    schedule 21.07.2014
comment
Legat de: Numerele negative returnează false în C/C++? și Operatori logici în C   -  person Shafik Yaghmour    schedule 21.07.2014


Răspunsuri (2)


Am dreptate când cred că a doua abordare este modul corect în care operatorii logici lucrează în C?

Da. Mergeți corect.
Amintiți-vă că în C, o valoare diferită de zero este tratată ca true. -1 este, de asemenea, true și va fi tratat la fel ca 1 pentru operațiile logice.
În

k = !5 && j ;

! este un operator de negație logică. !5 este false (există un operator diferit ~ în C pentru negația bit-wise). k va deveni 0.

person haccks    schedule 21.07.2014
comment
Am înțeles, mulțumesc mult. Cu toate acestea, încă nu sunt clar despre cel de-al doilea fragment de cod, unde este folosit un NOT logic în interiorul unui AND logic. Ai putea te rog să mă ajuți în privința asta? - person Manish Giri; 21.07.2014
comment
@Cavalerul intunecat; Vezi actualizarea. - person haccks; 21.07.2014
comment
Scurtcircuitarea este importantă numai pentru efecte secundare (cum ar fi invocarea UB în partea omisă a expresiei). ~ nu este o negație, ci un complement pe biți, o operație pe biți... - person Deduplicator; 21.07.2014
comment
@Deduplicator; Cred că NU pe biți, complementul și negația sunt același lucru. en.wikipedia.org/wiki/Bitwise_operation#NOT - person haccks; 21.07.2014
comment
@Deduplicator; De ce nu ? - person haccks; 21.07.2014
comment
Ei bine, când adaugi pe biți, se întâmplă. Oricum, suntem programatori, folosind exact aceiași termeni pentru trei operațiuni pe care le putem efectua în mod rezonabil în același context este... oarecum rău. - person Deduplicator; 21.07.2014
comment
De ce o valoare diferită de zero este tratată ca fiind adevărată în C? O valoare este adevărată în C dacă ORICE dintre biții din variabilă este setat. Dacă NIMIC dintre biții din variabilă nu este setat, atunci sunt doar zerouri: 000...000, care este 0, care este fals. - person Galaxy; 27.06.2018
comment
@Galaxie; Știți vreo valoare care este diferită de zero și toți biții săi sunt setați la 0? - person haccks; 27.06.2018
comment
@haccks; Nu în reprezentarea standard a numerelor întregi în computerele moderne, dar, desigur, biții înșiși ar putea avea orice semnificație arbitrară atribuită lor. - person Galaxy; 28.06.2018

În ceea ce privește a doua întrebare despre negație (logică):

int j = 4, k ;
k = !5 && j ;

Deoarece orice valoare diferită de zero este adevărată, NOT anulează o valoare booleană, nu un int, deci următorii pași merg astfel:

k = !true && true
  = false && true
  = false
person Michelle    schedule 21.07.2014