2016-09-27 1 views
2

Pour des raisons qui ne valent pas la peine d'être mentionnées, je souhaite savoir s'il existe une valeur standard définie pour les expressions booléennes. Par exemple.Valeur de retour d'une expression booléenne dans C

int foo() { 
    return (bar > 5); 
} 

Le contexte est que je crains que notre équipe a défini TRUE comme quelque chose de différent de 1, et je crains que quelqu'un peut faire:

if (foo() == TRUE) { /* do stuff */ } 

Je sais que la meilleure option serait être simplement faire

if (foo()) 

mais on ne sait jamais.

Existe-t-il une valeur standard définie pour les expressions booléennes ou cela dépend-il du compilateur? Si oui, la valeur standard est-elle quelque chose inclus dans C99? Qu'en est-il de C89?

+1

il y a un type standard 'bool' avec des constantes'on' et' false' défini dans l'en-tête standard 'stdbool.h' depuis C99. –

+2

Pour compléter ce que Eugene a dit, vous pouvez être intéressé par ce lien: http://fr.cppreference.com/w/c/types/boolean –

+0

Merci. Je cherche en fait des faits argumentatifs pour 1) changer cette définition de TRUE, et 2) utiliser un compilateur compatible C99 (en ce moment, nous utilisons un C89 conforme) – JACH

Répondre

3

Un opérateur tel que ==, !=, && et || qui se traduit par une valeur booléenne sera évaluée à 1 de l'expression est vraie et 0 si l'expression est fausse. Le type de cette expression est int. Par conséquent, si la macro TRUE n'est pas définie comme 1, une comparaison comme celle ci-dessus échouera.

Lorsqu'une expression est évaluée dans un contexte booléen, 0 est évalué à false et non à zéro à vrai. Donc, pour être sûr, TRUE doit être défini comme:

#define TRUE (!0) 

Comme mentionné dans les commentaires, si votre compilateur est conforme à C99, vous pouvez #include <stdbool.h> et utiliser true et false.

Selon C99:

6.5.3.3 (opérateurs arithmétiques unaires)

Le résultat de l'opérateur de négation logique ! est de 0 si la valeur de son opérande compare pas égal à 0, 1 si La valeur de son opérande est égale à 0. Le résultat est de type int. L'expression !E est équivalente à (0==E).

6.5.8 (opérateurs relationnels)

chacun des opérateurs < (inférieur), > (supérieur à), <= (inférieur ou égal à), et >= (supérieure ou égal à) doit donner 1 si la relation spécifiée est vraie et 0 si elle est fausse. Le résultat a le type int.

6.5.9 (opérateurs égalité)

Le == (égal à) et != opérateurs (pas égal à) sont analogues aux opérateurs relationnels à l'exception de leur priorité inférieure. Chacun des opérateurs cède 1 si la relation spécifiée est vraie et 0 si elle est fausse. Le résultat est de type int.

6.5.13 (ET LOGIQUES)

L'opérateur && doit céder 1 si ses deux opérandes comparer différent de 0; sinon, il donne 0. Le résultat a le type int.

6.5.14 (opérateur logique OU)

L'opérateur doit céder || 1 si l'un de ses opérandes comparer différent de 0; sinon, il donne 0. Le résultat a le type int.

+0

Merci. Je m'attendais à ça. Mais je ne suis pas sûr si elle évalue à 1 par standard, ou si c'est quelque chose de spécifique au compilateur – JACH

+0

@JACH Ajout de notes supplémentaires de C99 concernant les expressions booléennes. – dbush

+0

Détail: le _type_ du résultat est 'int' avec' ==,! =, &&, ||,!,>,> =, <, <= ' – chux

1

Le langage de programmation C ne définit pas Valeur booléenne. Traditionnellement, le langage de programmation C utilise les types integer pour représenter les types de données booléens.

valeurs booléennes dans C:

0 = false` 

Any other value = true` 

Habituellement, les gens utiliseront 1 pour vrai.

C99 introduit le type de données _Bool qui ne sont pas disponibles dans d'autres lien wikipedia C de derivates.See here. De plus, un nouvel en-tête stdbool.h a été ajouté pour des raisons de compatibilité. Cet en-tête permet aux programmeurs d'utiliser les types boolean de la même manière, comme dans le langage C++.

Pour utiliser bool dans C, nous pouvons utiliser enum comme ci-dessous.

enum bool { 
    false, true 
}; 

bool value; 
value = bool(0); // False 
value = bool(1); // True 

if(value == false) 
    printf("Value is false"); 
else 
    printf("Value is true"); 

En outre, la question liée à débordement de la pile Is bool a native C type?

+1

Merci pour le lien, très instructif. Ma question, cependant, était plus liée au résultat des opérations booléennes, puisque nous utilisons déjà TRUE ou FALSE en tant que type pseudo-booléen. – JACH