2010-06-24 28 views
11

J'ai une boucle for qui continue d'incrémenter une valeur entière jusqu'à la fin de la boucle. Donc, si la limite n est une variable double et que la variable incrémentée 'i' est un entier, je suis incrémenté au-delà de ses limites.Incrémentation d'une valeur entière au-delà de sa limite entière - C#

double total = 0; 
double number = hugetValue; 
for (int i = 1; i <= number; i++) 
{ 
    total = total + i; 
} 
return total; 

Qu'arrive-t-il à 'i' s'il dépasse sa capacité? Comment la valeur de i change? Est-ce que je vais avoir une erreur d'exécution?

Merci

VSN

+1

Quelle langue? – sharptooth

+0

Édité le titre. – NLV

+1

J'ai ajouté la balise C# à la question. Pour certaines personnes (c'est-à-dire au moins pour moi) c'est plus utile. SO vous permet de filtrer in/out basé sur des étiquettes, et vous pouvez obtenir des listes de questions basées sur un tag. La plupart du temps, je ne regarde que les tags spécifiques pour lesquels je suis intéressé et seulement si souvent je reçois une liste des questions les plus récentes indépendamment de l'étiquette. –

Répondre

8

Tout comme le comportement dans certains implentations de C où un int juste enroule autour de INT_MAX à INT_MIN (si elle est en fait un comportement non défini selon la norme ISO), C# enveloppe également. Le tester dans VS2008 avec:

int x = 2147483647; 
if (x+1 < x) { 
    MessageBox.Show("It wrapped..."); 
} 

entraînera l'affichage de la boîte de message.

Si votre hugetValue est supérieur à la valeur maximale int, votre boucle s'exécutera pour toujours à cause de cela.

Par exemple, si elle est 2147483648, comme vous pensez que vous obtenez près de lui, les int se enroule autour de 2147483647 retour à -2147483648 et la boucle continue juste à aller.

+0

J'ai écrit en C#. Désolé de ne pas le mentionner. Je te comprends comprendre ta réponse. – NLV

+0

@NLV: Certains vont pour C#. – leppie

+0

@NLV: J'ai modifié la question pour inclure la balise C#. Notez que dans de nombreuses questions, le langage est important (certains permettent implicitement la conversion, d'autres ne l'autorisent pas au moment de la compilation). Lorsque vous posez une question, plus vous fournissez d'informations - dans des termes raisonnables - mieux c'est. –

3

Toutes mes excuses si cela semble grossier, mais vous apprendrez beaucoup plus en essayant vous-même.

Édité: aha, donc vous l'avez essayé et obtenu des résultats inattendus. Comme cela a été expliqué ailleurs, les langages de type C ont tendance à envelopper discrètement l'arithmétique des nombres entiers. C'est en fait un comportement plutôt raisonnable en général si le coût de la vérification du débordement est élevé. Une fois que vous savez que cela peut se produire, on code soigneusement, en particulier en regardant le type de construction dans votre exemple.

+0

A pris dans le bon sens. En fait, j'ai essayé et j'ai été coincé dans une boucle infinie. Quand je l'ai débuggé, j'ai vu que la valeur de i était négative. Je me demandais pourquoi cela faisait une erreur et continuait la boucle. Des raisons pour cela? – NLV

+0

Il y a deux problèmes différents ici, pourquoi la conversion donne un nombre négatif et pourquoi le compilateur ne se plaint pas à la condition que la valeur soit négative. Le plus récent est le plus simple: vous pourriez modifier la variable de boucle à l'intérieur de la boucle et la rendre négative. Détecter si cela arrive ou non est un problème trop complexe pour le compilateur à essayer, donc il suppose que vous savez ce que vous voulez (ou vous trouverez bientôt quand vous êtes coincé dans votre boucle infinie) –

2

Si vous souhaitez une exception, fournissez l'option du compilateur checked ou utilisez la construction checked fournie en C#.

+0

Juste pour citer une source: http://msdn.microsoft.com/fr-fr/library/a569z7k8.aspx Fondamentalement, tous les ops sont décochés, sauf si vous utilisez des constantes des deux côtés - celles-ci sont vérifiées lors de la compilation. –