2017-09-13 2 views
0

Je vais vous montrer mon soumis la réponse de l'affectation à donner l'idée de ceJe mets une rupture de boucle dans java au début du bloc de boucle et pas avant le mot-clé loop. Est-ce commun ou cela apporterait-il des résultats inattendus?

void chkbnch() 
{ 
    System.out.println("\n The students under notice period are =>\n\n"); 
    for(int i=0;i<25;i++) 
    **ol:{** 
     int cnm=0; 
     int cnm2=0; 
     for(int j=0;j<7;j++) 
     { 
      if(mrks[i][j]>=50) 
      { 
       cnm++; 
      } 
      if(cnm==3) 
      { 
        //i++; 
        **break ol;** 
      } 
      if(mrks[i][j]<50) 
      { 
       cnm2++; 
      } 
     } 
     if(cnm2>=3||cnm<3) 
     { 
      System.out.println("\n Student id =>"+(i+1)); 
     } 
    } 
} 

J'utilise ici pause quand je ne veux pas la boucle pour incrémenter et simplement répéter la déclaration de la boucle. Je sais que cela peut être fait en décrémentant aussi le contrôle de la boucle, mais ce n'est pas ce que ma question est. Tout ce que je veux demander c'est que ce comportement est défini dans java ou est-ce juste une chance que ce soit son résultat.

+0

Pourquoi ne pas simplement "break" standard si tout ce que vous voulez faire est de sortir de la boucle? – EJoshuaS

+0

Cela ne provoque-t-il pas une boucle infinie (puisque vous n'avez pas incrémenter 'i' vous devriez obtenir exactement le même résultat que lors de la dernière itération)? – UnholySheep

Répondre

-1

Cette utilisation de l'instruction break est parfaitement légale, bien qu'elle soit inhabituelle, et qu'elle ne fasse pas ce que vous dites.

JLS §14.15 dit:

Une déclaration break avec étiquette Identificateur tente de transférer le contrôle à la qui a le même identificateur que l'étiquette enveloppante instruction étiquetée (§14.7); Cette instruction, appelée , cible la cible, puis se termine immédiatement normalement. Dans ce cas, la cible de rupture n'a pas besoin d'être une instruction switch, while, do ou for.

La « déclaration portant la mention » dans votre exemple est l'instruction de bloc { .. }, qui est l'instruction exécutée par la boucle for. Lorsque vous exécutez la coupure, cette instruction de bloc se termine, ce qui renvoie le contrôle à la boucle for, qui continue en exécutant l'incrément i++, en testant la condition i<25 puis en poursuivant la boucle.

Il a le même comportement que l'étiquetage de la boucle externe directement, puis en utilisant continue ol;.

Le compteur de boucle sera toujours incrémenté. Si vous voulez éviter cela, vous pouvez le contrecarrer avec un manuel i--; ou déplacer i++; sur l'en-tête de boucle for et à la fin du corps de la boucle.

+0

vrai et merci. Je pense que le programme a fonctionné parfaitement à cause d'autre chose et pas de ça. Bien que dans C (Dev C++), quelque chose comme ceci est en train de provoquer une boucle infinie int i; \t pour (i = 1; i <= 10; i ++) ol: { \t \t printf ("% d", i); \t \t si (i% 4 == 0) { goto ol; } } @Boann –

+0

@HimanshuPanchal Cela serait en effet infini en C++. 'goto' * va directement à l'instruction étiquetée, donc la boucle' for' n'a pas l'occasion de faire 'i ++'. Considérant que 'break' * complète * l'instruction étiquetée, complétant ainsi l'itération de la boucle en cours, qui renvoie le contrôle à l'instruction' for' pour voir si elle veut faire une nouvelle boucle. – Boann

-1

On dirait que vous voulez le mot-clé continue au lieu de pause. continue interrompt l'itération en cours de la boucle et l'exécution revient à l'étape d'évaluation où la boucle continue si l'évaluation réussit. break interrompt l'itération en cours de la boucle et l'exécution saute à la première ligne après l'accolade de fermeture de fin de boucle. EDIT: Si vous avez besoin du contrôle d'incrément de boucle pour "ne pas incrémenter" lorsque vous continue boucle, de sorte que, par exemple, le même objet soit tiré de la liste en boucle après avoir continué, alors vous devez rouler le vôtre Solution.

+0

Je sais que mon ami et ce n'est pas ce que ma question est. Je veux savoir ce qui devrait arriver, je mets l'étiquette de rupture au début du bloc seulement et est-ce définitif? Et continue ne répète pas la boucle pour la même itération et c'est ce que je voulais là de toute façon. –

+0

Ok, maintenant je vois que vous parlez d'utiliser "labels" comme une forme de 'break' (et' goto'). Voir cette réponse: https://stackoverflow.com/questions/26430630/how-to-use-goto-statement-correctly. Vous avez besoin à la fois du label 'break' et des parties 'GoTo'. Vous pourriez juste avoir l'étiquette en haut de la boucle, mais sans la partie 'GoTo', votre code ne sauterait jamais à l'étiquette. – geneSummons