web-dev-qa-db-fra.com

Deux points-virgules à l'intérieur d'une parenthèse for-loop

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

28
osse
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).

60
taocp

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 returns ou breaks.

2
Fls'Zen

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){

}
2
Travis J

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 forme for(;;) plus succincte à la forme sémantiquement équivalente mais plus verbeuse while (true) forme.

2
Suraj Jain