Je personnalise un code que j'ai trouvé sur Internet (c'est le Adafruit Tweet Receipt ). Je ne peux pas comprendre de nombreuses parties du code, mais le plus déroutant pour moi est la boucle for avec deux points-virgules à l'intérieur des parenthèses
boolean jsonParse(int depth, byte endChar) {
int c, i;
boolean readName = true;
for(;;) { //<---------
while(isspace(c = timedRead())); // Scan past whitespace
if(c < 0) return false; // Timeout
if(c == endChar) return true; // EOD
if(c == '{') { // Object follows
if(!jsonParse(depth + 1, '}')) return false;
if(!depth) return true; // End of file
if(depth == resultsDepth) { // End of object in results list
Que signifie pour (;;) ? (C'est un programme Arduino donc je suppose qu'il est en C).
for(;;) {
}
signifie fonctionnellement
while (true) {
}
Il cassera probablement la boucle/retour de la boucle en fonction d'une condition à l'intérieur du corps de la boucle.
La raison pour laquelle for(;;)
boucle pour toujours est parce que for
a trois parties, chacune étant facultative. La première partie initialise la boucle; le second décide de continuer ou non la boucle, et le troisième fait quelque chose à la fin de chaque itération. Il est complet, vous verrez généralement quelque chose comme ceci:
for(i = 0; i < 10; i++)
S'il manque la première (initialisation) ou la dernière (fin d'itération), rien n'est fait à leur place. Si la partie centrale (test) est manquante, alors elle agit comme si true
était là à sa place. Ainsi, for(;;)
est identique à for(;true;)
', qui (comme illustré ci-dessus) est identique à while (true)
.
La boucle for
a 3 composants, séparés par des points-virgules. Le premier composant s'exécute avant le début du bouclage et est couramment utilisé pour initialiser une variable. Le second est une condition. La condition est vérifiée au début de chaque itération, et si elle a la valeur true, le code de la boucle s'exécute. Le troisième composant est exécuté à la fin de la boucle, avant qu'une autre itération (commençant par la vérification de condition) ne commence, et est souvent utilisée pour incrémenter une variable.
Dans votre cas, for(;;)
signifie qu'il va boucler pour toujours car la condition n'est pas présente. La boucle se termine lorsque le code return
s ou break
s.
Chaque clause d'une boucle for
est facultative. Donc, quand ils sont exclus, il boucle toujours. for
boucles compilées en while
boucles.
Le résultat final devient une vérification pour initialiser toutes les variables, qui se termine après que rien ne se passe car il est vide, une vérification de la condition booléenne dans la deuxième clause, qui n'est pas présente pour que la boucle démarre, et une fois que la boucle atteint le crochet de fin, une vérification pour voir s'il y a du code à exécuter avant de vérifier à nouveau la condition booléenne.
Dans le code, cela ressemble à:
while(true){
}
Voici ce que Wikipedia dit à ce sujet
Utiliser comme boucles infinies
Cette boucle for de style C est généralement la source d'une boucle infinie car les étapes fondamentales de l'itération sont entièrement sous le contrôle du programmeur. En fait, lorsque des boucles infinies sont prévues, ce type de boucle for peut être utilisé (avec des expressions vides), comme:
for (;;)
//loop body
Ce style est utilisé à la place des boucles infinies
while(1)
pour éviter un avertissement de conversion de type dans certains compilateurs C/C++. Certains programmeurs préfèrent la formefor(;;)
plus succincte à la forme sémantiquement équivalente mais plus verbeusewhile (true)
forme.