Si j'ai une instruction if en C qui ressemble à ceci:
if( function1() > 0 && function2() > 0 ){
//blah
}
Quelle fonction s'exécutera en premier et s'exécutera-t-elle toujours dans cet ordre?
Ici, function1()
est garanti pour être exécuté en premier.
L'opérateur &&
Est un opérateur de court-circuit . function2()
ne sera même pas appelé sauf si le résultat de function1()
est supérieur à zéro.
De la norme C99:
Contrairement à l'opérateur binaire & au niveau du bit, l'opérateur && garantit une évaluation de gauche à droite; il y a un point de séquence après l'évaluation du premier opérande. Si le premier opérande se compare à 0, le deuxième opérande n'est pas évalué.
function1
, Et oui. function2
Sera appelé si et seulement si la condition précédente est true
.
Ceci est appelé "court-circuit", et il est essentiel, par exemple pour une instruction comme celle-ci: if (p != 0 && *p == 'X')
Nous pouvons être certains que p
ne sera jamais déréférencé s'il est nul.
function1()
sera exécuté en premier et si son résultat est inférieur ou égal à 0 function2()
n'est pas exécuté du tout.
Dans ce cas particulier, la fonction1 sera toujours exécutée en premier car vous utilisez l'opérateur &&.
De plus, si function1 ()> 0, function2 ne sera pas appelée du tout.
Cela évaluera de gauche à droite. Vérifiez ceci pour plus d'informations
Dans votre extrait de code, function1()
s'exécutera en premier et function2()
s'exécutera niquement si la première condition donnera true
.
Vous pouvez facilement le vérifier: ajoutez un peu de printf dans chaque fonction et laissez function1()
retourner 1.
function1()
sera appelé en premier. Ce n'est pas le if
qui implique la commande, mais le &&
: l'opérande gauche est évalué en premier et le deuxième opérande n'est évalué que si l'opérande gauche a renvoyé une valeur non nulle.