Un ou plusieurs des codes ci-dessous terminent, et ce quelque soit la valeur de x passée en paramètre. Lesquels ?
A:
void loop(int x) {
for (int y = Math.abs(x); y != -1; ++y) x++;
}
B:
void loop(int x) {
int n = 0;
for (int y = x; y != 0; y >>>= 1) n += y & 0x1;
}
C:
void loop(int x) {
while(x & -x == 0) {}
}
D.
void loop(int x) {
for(int i = x-1; i < x; i++) x++;
}
Solution
-
Dans le premier code, lorsque
yatteintInteger.MAX_VALUE, l’incrémenter causera un overflow qui lui donnera la valeurInteger.MIN_VALUE. Il sera ensuite incrémenter jusqu’à atteindre-1, et la boucle s’arrêtera. Il convient de noter que l’instructionx++n’a aucune influence sur le résultat, carint y = Math.abs(x)n’est évalué qu’une seule fois, lors de l’entrée dans la boucle. -
Etant donné que le shift logique vers la droite ajoute toujours des
0,yfinira forcément par devenir0, une fois que suffisamment de shifts sont effectués. La conditiony != 0deviendra fausse et la boucle se terminera. -
Pour la valeur
x = 0, la conditionx & -x == 0est toujours vraie. La boucle ne se terminera donc pas. -
Dans ce dernier code,
ietxvont être incrémentés jusqu’à ce quexatteigneInteger.MAX_VALUE, alorsi = Integer.MAX_VALUE - 1. A la prochaine itération,xva overflow et passer dans les négatifs, il va donc prendre la valeurInteger.MIN_VALUEtandis queiprendra la valeurInteger.MAX_VALUE. Ainsi :i = Integer.MAX_VALUE > x = Integer.MIN_VALUELe programme se termine pour tout
xpassé en paramètre.
Les réponses correctes sont donc les réponses A, B et D.