2011-10-05 21 views
6

Si consideri il codice C++ di seguito:Riassumendo valori bool in C/C++

bool a = 5; 
bool b = 6; 
int c = (int)a + (int)b; 

Quando compilo & eseguire questo codice, c ha il valore 2. La garanzia standard che, in qualsiasi compilatore/piattaforma, bool i valori inizializzati con false (0) o true (non necessariamente 1) saranno 1 in operazioni e il codice sopra risulterà sempre in c essendo 2?

E in C99, incluso stdbool.h, è ancora valido?

+1

immagino la tua la risposta è qui: http://stackoverflow.com/questions/2725044/can-i-assume-booltrue-int1-for-any-c-compiler –

+2

IMO, se assegni qualcosa di diverso da vero/falso a una variabile bool dovrebbe essere sottoposto a revisione del codice. – Max

+0

Ho solo una parola: PERCHÉ? –

risposta

10

Sezione 4.7 (versioni interi) della norma C++ dice:

Se il tipo di origine è bool, il valore falso viene convertito in zero e il valore vero viene convertito in uno.

Il paragrafo 4.9 offre la stessa garanzia per le conversioni in virgola mobile.

+0

Grazie, questa risposta per C++, ma è valida anche per C99 (con stdbool)? – fbafelipe

1

Per i compilatori, la regola è spesso che false è 0 e qualsiasi altra cosa sarà vera. Tuttavia, il trattamento di bool come se fosse un tipo intero di solito è considerato una cattiva forma. Lo standard tuttavia include una regola da convertire in int e l'assunzione è corretta false = 0 e true = 1 purché il compilatore aderisca allo standard!

In ogni caso, perché l'aritmetica con i tipi di bool?

Spero che questo aiuto

+0

L'aritmetica con tipi di bool può essere utile per scrivere meno codice, quindi è possibile scrivere x + = a ;, invece di x + = (a? 1: 0) ;. – fbafelipe

+0

Perché non usare x | = a; o anche x = x || un; tutto bello e rispettoso dei tipi sottostanti – Martin

+0

E se x è un int, contando quanti (di un set di bool) sono veri? So che ci sono dei modi per aggirare, ma poiché sembra più semplice, sto facendo la domanda per sapere se funzionerà sempre. – fbafelipe

1

Secondo la norma:

  • true converte in 1
  • false converte in 0

E fuse per int non è necessaria in quanto la conversione a int è implicito.

1

David Schwartz ha già risposto per C++. Per lo standard C99 abbiamo 6.3.1.4:

Quando un valore scalare viene convertito in _Bool, il risultato è 0 se il valore confronta uguale a 0; in caso contrario, il risultato è 1.

Dal 6.3.1.1 della norma rende anche chiaro che _Bool è soggetto a promozioni interi è chiaro che un _Bool sarà sempre 0 o 1.

Problemi correlati