Correction d’une boucle cassée en changeant exactement un caractère

J’ai trouvé un site avec des énigmes C compliquées. En ce moment, j’ai affaire à ceci:

Ce qui suit est un morceau de code C, dont l’intention était d’imprimer un signe moins 20 fois. Mais vous pouvez remarquer que ça ne marche pas.

#include  int main() { int i; int n = 20; for( i = 0; i < n; i-- ) printf("-"); return 0; } 

Bien corriger le code ci-dessus est simple. Pour rendre le problème intéressant, vous devez corriger le code ci-dessus, en changeant exactement un caractère. Il existe trois solutions connues. Voyez si vous pouvez obtenir tous ces trois.

Je n’arrive pas à comprendre comment résoudre. Je sais que cela peut être corrigé en changeant -- en ++ , mais je ne peux pas déterminer quel caractère à changer pour que cela fonctionne.

Voici une solution:

 for( i = 0; -i < n; i-- ) printf("-"); 

En voici une seconde, merci à Mark de m'avoir aidé!

 for( i = 0; i + n; i-- ) printf("-"); 

Et Mark avait aussi le troisième qui est

 for( i = 0; i < n; n-- ) printf("-"); 

Changer i-- en n-- est un autre.

D’accord – Gab a résolu le problème, alors j’ai retiré l’autre solution. Il gagne!

Troisième réponse:

 for( i = 0; i + n; i-- ) printf("-"); 

Merci à Gab Royer pour son inspiration.

Explication: Finalement, i + n donnera -20 + 20 = 0 ce qui est false .

  for( i = 0; i < n; n-- ) printf("-"); 

Changé i-- en n--

En voici un, je pense:

 for( i = 0; i < n; n-- ) 

La comparaison dans la boucle for peut être toute expression – vous pouvez nier i.

 for (i = 0; -i < n ; i--) 

Solution 1

 #include  int main() { int i; int n = 20; for( i = 0; i < n; n-- ) // Change i-- to n-- printf("-"); return 0; } 

Solution 2

 #include  int main() { int i; int n = 20; for( i = 0; -i < n; i-- ) // Compare to -i printf("-"); return 0; } 

Je n'ai pas figuré un tiers.

En voici un autre:

 #include  int main() { int i; int n = -20; //make n negative for( i = 0; i < n; i-- ) printf("-"); return 0; }