Je sais que les opérateurs logiques vérifient les courts-circuits. En d’autres termes, s’il existe une déclaration telle que A && B && C
, si A
est faux, B
et C
ne sont pas évalués. Mais est-ce également vrai dans les cas où B
et C
sont des appels de fonction?
Par exemple, l’instruction return dans ce code:
bool areIdentical(struct node * root1, struct node *root2) { /* base cases */ if(root1 == NULL && root2 == NULL) return true; if(root1 == NULL || root2 == NULL) return false; /* Check if the data of both roots is same and data of left and right subtrees are also same */ return (root1->data == root2->data && //I am talking about this statement areIdentical(root1->left, root2->left) && areIdentical(root1->right, root2->right) ); }
Oui, les fonctions ne sont pas appelées si root1->data == root2->data
est false
.
Le contrôle simple consiste à faire ceci:
#include #include int main(void) { write(1, "z", 1); if ((1 == 0) && write(1, "a", 1) && write(1, "b", 1)) { write(1, "c", 1); } write(1, "d", 1); return (EXIT_SUCCESS); }
La logique et l’opérateur court-circuiteront, quels que soient les opérandes , si nous examinons le projet de norme C99, section 6.5.13
, le paragraphe 4 de l’ opérateur logique ET dit 6.5.13
:
Contrairement à l’opérateur binary & bitwise, l’opérateur && garantit une évaluation de gauche à droite; il y a un sharepoint séquence après l’évaluation du premier opérande. Si le premier opérande est égal à 0, le deuxième opérande n’est pas évalué .
Notez que le deuxième opérande ne sera évalué que si le premier est false
. Notez également que cela garantit une évaluation de droite à gauche et un sharepoint séquence après la première évaluation.
oui, c’est vrai aussi dans les appels de fonction.
#include void main() { if(0&&printf("hello")) { printf("true"); } else printf("false"); }
Par exemple, si vous considérez le code ci-dessus, la sortie sera fausse. Cependant, remplacer 0 par 1 dans “if condition” donnera le résultat “hellotrue”.