C utilise-t-il l’évaluation des courts-circuits même lorsque les arguments sont des appels de fonction?

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”.