Quando si usano int come valori booleani, è in forma scadente usare direttamente 0 e 1?

0

È meglio farlo

#define INT_TRUE 1
#define INT_FALSE 0

int someFunctionalityIsEnabled = INT_TRUE;

o questo?

int someFunctionalityIsEnabled = 1;

Si può tranquillamente presumere che il falso sarà sempre zero e il vero sarà diverso da zero.

    
posta Adam S 14.08.2013 - 17:31
fonte

2 risposte

6

It can be safely assumed that false will always be zero and true will be non-zero.

In questo caso, la tua domanda è quasi inutile: se sei sicuro che chiunque leggendo il tuo codice sappia come "vero" e "falso" sono rappresentati come numeri, allora potresti non bisogno di quelle #define macros.

Effetto collaterale positivo di questi #define s. Sto dicendo "quasi" perché questi #define s hanno ancora un valore: senza nomi come TRUE e FALSE , scegliendo la variabile sensibile i nomi diventano un po 'più importanti. Ad esempio:

int is_enabled = 1;
int age_in_years = 1;

Come puoi sapere quale variabile memorizza un valore booleano e quale numero intero? Osservando i nomi delle variabili. Ora, che ne dici di questo?:

int is_enabled = TRUE;
int age_in_years = 1;

Il #define s aggiunge una certa ridondanza (oltre ai nomi delle variabili ben scelti) che ti aiuta a riconoscere più facilmente il tipo "reale" di quelle variabili int .

Per questa ragione di maggiore chiarezza, ti consiglio di utilizzare tale #define s, o se stai usando un compilatore conforme a C99, #include <stdbool.h> .

Effetto collaterale negativo di questi #define s. C'è anche un lato negativo nel dichiarare un TRUE letterale. Stai dicendo che "vero" può essere rappresentato da "qualsiasi numero intero non zero". Definire TRUE come equivalente a 1 è quindi impreciso, poiché questo è solo uno dei tanti valori possibili che significano "vero". ( FALSE non ne risente). Questo porta alla conseguenza un po 'assurda che scrivere is_enabled == FALSE funzionerà come previsto, ma is_enabled == TRUE potrebbe non. Esistono due modi per risolvere questo problema:

  1. NON confrontare mai i valori booleani usando == o != . Invece,

    • DO scrivi is_enabled anziché is_enabled == TRUE e
    • DO scrivi !is_enabled anziché is_enabled == FALSE .
  2. CONSIDER che ridefinisce "true" come "numero intero 1" anziché "qualsiasi numero intero diverso da zero". (Non lo farei, poiché contraddice il modo in cui C interpreta gli interi come valori booleani ... ma è una possibilità teorica.)

Ti consiglio di andare con # 1 per il motivo indicato.

    
risposta data 14.08.2013 - 19:20
fonte
2

Il risultato è lo stesso. Usando il

#define TRUE 1 
#define FALSE 0 

è più prolisso, ma può rendere il tuo codice più leggibile per le generazioni future (di programmatori o le tue cellule cerebrali) che stanno mantenendo l'applicazione e stanno cercando di decifrare il codice.

    
risposta data 14.08.2013 - 19:00
fonte

Leggi altre domande sui tag