Newsgroup: it.comp.lang.c
Titolo: Boolean

Scusate, a quanto so in C non esiste il tipo di valore booleano. Ma come si
fa a compensare a questa mancanza? Per esempio, alla mancanza delle stringhe
si risponde con gli array di caratteri, ma per il valore booleano?
---
Ramses
---
icq:39860665
http://knowledgeparty.cjb.net
http://evilz0ne.cjb.net

si risponde con gli array di caratteri, ma per il valore booleano?
Il C usa il valore 0 per FALSE e != 0 per TRUE.
Di solito si usa:
#define FALSE 0
#define TRUE 1
oppure
typedef enum BOOLEAN { FALSE, TRUE };
nel secondo caso puoi usare dichiarazioni tipo:
BOOLEAN x = FALSE;
ciao, acc.   
a...@libero.it

#define TRUE 1
E qui va male. Se true è per definizione un valore diverso da zero, non è
detto che debba per forza essere 1, quindi un controllo basato
sull'uguaglianza a TRUE (es. pino == true) può risultare falso anche se pino
non è falso.
Lanugo

#define TRUE 1
E qui va male. Se true è per definizione un valore diverso da zero, non è


 typedef enum BOOLEAN { FALSE, TRUE };
Thanx



Beh a dire il vero acc non ha detto che TRUE equivale al valore booleano di
true, ma solo che spesso viene utilizzata questa tecnica, seocndo alcuni
discutubile, secondo altri utile.
Certo č che i confronti non vanno mai fatti con TRUE, ma solo con FALSE,
tuttavia TRUE puň tornanre utile quando si ritorna un valore da una funzione
"return TRUE;"
questo infatti puň essere piů comodo da leggere che "return 1", oppure in
asasegnamento di una variabile ecc...

 Lanugo


 0.
Ma infatti scrivere
if(pino)
 va sempre bene nessuno ti ha mai detto il contrario.
Invece non va per niente bene
if( (pino == N) == TRUE )
dove se anche pino e' effettivamente uguale a N non è detto che la
condizione sia verificata, e in particolare non è verificata se
l'espressione pino == N restituisce un valore diverso da 1, cosa che può
benissimo succedere.

 asasegnamento di una variabile ecc...
Ma su, ragazzi! Basta definire
#define FALSE 0
#define TRUE !0
e tutti i problemi spariscono.
EMG

 e tutti i problemi spariscono.
#define FALSE    0
#define TRUE    !FALSE
....
if( 2 == TRUE)
   printf("se mi vedi hai un culo pazzesco!\n");
else
    printf("che sfiga!"\n);

 Scusate, a quanto so in C non esiste il tipo di valore booleano.
   E chi l'ha detto?
 
http://wwwold.dkuug.dk/JTC1/SC22/WG14/www/newinc9x.htm
   Inoltre, chi ha mai sostenuto che sia cosi` necessario? Esempi del tipo:
	- char *p="string"; while(*p) p++;
	- while(1) { /* a loop without way out */ }
	- int flag=1; if(flag) do_something(); else do_not();
sembrano abbastanza evidenti...
	Alla prossima,
		Marco

     printf("che sfiga!"\n);
Capisco quello che vuoi dire, che sfiga;-)
Ma vedi, basta if(2) !
TRUE settato ad 1 (o a qualsiasi altro valore diverso da 0) serve per varie
cose:
int b=TRUE;
if(b){ ... }
while(b) { ...if(...) b=FALSE;.... }
whille(TRUE);
etc...
Insomma TRUE non serve come voleva usarlo "Lanugo of the wandering souls"
che ha portato questa discussione fuori strada. Forse si confonde con il C++
?!? Non credo ci fosse nulla da dire rispetto a quello che ha scritto acc:
#define FALSE 0
#define TRUE 1
In altre parole 1 e' sempre true, ma true non e' sempre 1 !!! (puo' essere
qualsiasi valore diverso da 0).
Quindi NON si puo' certo usare if(2==TRUE), ma come ho detto TRUE serve per
altri scopi !
Quindi non si tratta di avere un culo pazzesco, anche se ho colto la
graziosa ironia di iGor, che e' stato piuttosto esemplificativo, anche se
forse non era quello che intendeva EMG. Certo che !0 non credo risolva molto
visto che in C nella maggior parte dei casi diventa 1 ;-)
In conclusione credo che Lanugo sia stato troppo pignolo ;-)
<QUOTE LANUGO>
E qui va male. Se true è per definizione un valore diverso da zero, non è
detto che debba per forza essere 1, quindi un controllo basato
sull'uguaglianza a TRUE (es. pino == true) può risultare falso anche se pino
non è falso.
</QUOTE>
Chi aveva parlato di uguaglianze ?!?  e poi true minuscolo e' del C++ !!! (o
meglio si spera che tu non lo faccia in C !)
Alex

 ha scritto
boolean type in <stdbool.h>
Questa davvero non la sapevo, ma guarda ....
Alex

 Marco
Grazie.


 Ma un integer occupa molta più memoria di un boolean o sbaglio?
e cmq "molta"..... si parla poi di 4 bytes !!!
Alex

 Alex


     printf("che sfiga!"\n);
Si, hai ragione.
EMG

 visto che in C nella maggior parte dei casi diventa 1 ;-)
No, infatti mi sono sbagliato.
EMG

typedef enum BOOLEAN { FALSE, TRUE };
Azz.. me scappata...forse togliendo il typedef va' meglio !
ciao, acc.   
a...@libero.it

non è falso.
L'errore sta nel confrontare il valore dell'espressione logica con un
valore numerico, mi spiego meglio:
#define TRUE  1
int x = TRUE;
if (x)
  // funziona
if (x==TRUE)
  // sbagliato
del resto quando mai si usano delle espressioni del tipo:
if ((a == b) == 1)
  // dove 1 sta per il valore logico TRUE
si usa invece:
if (a == b)
  // tout court
Quando si confronta un risultato logico, il confronto va sempre fatto
per == 0 o diverso da 0.
ciao, acc.   
a...@libero.it

Ma un integer occupa molta più memoria di un boolean o sbaglio?
In C non esiste il 'tipo' boolean, per rappresentare il valore di un
espressione logica viene usato un intero.
Certo un valore logico potrebbe essere rappresentato da un solo bit,
ma testare un bit e' piu' complicato (e piu' lento) che testare in
intero.
Ad ogni modo l'unica certezza e' che il valore logico FALSE e' 0
(zero), TRUE invece e' definito come diverso da 0, il valore esatto
dipende dall'implementazione del compilatore, normalmente e' 1 ma
potrebbe essere 0xFFFF etc...
 
ciao, acc.   
a...@libero.it

 Ma un integer occupa molta più memoria di un boolean o sbaglio?
   Dipende da come e` implementato il /boolean/. Considera, tuttavia, 
che l'/int/ e` il tipo che descrive la parola della macchina e quindi 
garantisce le prestazioni migliori.
--
Alla prossima,
Marco

#define TRUE 1
a parte il fatto che l'uso delle macro è (se possibile) da evitare,
cmq in questo caso è sbagliato:
int i=2;
if(i) {
	/* codice eseguito */
}
if(i==TRUE) {
	/* codice non eseguito */
}
Anto
--
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 Cosa significa built-in type? Cioč, non la traduzione, cosa sarebbero?
In parole povere sono i tipi fondamentali (per il C):
char, int, float, double e le loro varianti.
Ad esempio una struct (oppure meglio una classe/struct C++) sono dei tipi,
ma non built-in, non quelli fondamentali, non quelli forniti dal compilatore
come tipi primitivi.
Quando scarici la classe C++ Int128 che permette di eseguire operazioni su
interi a 128 bits (trattandola praticamente come un built-in type) questa
non e' built-in ma viene programmata in C++. Capito la differenza ?!?
Alex