Maison >développement back-end >C++ >Pourquoi cette boucle déborde-t-elle et produit-elle une sortie inattendue ?

Pourquoi cette boucle déborde-t-elle et produit-elle une sortie inattendue ?

DDD
DDDoriginal
2024-12-02 18:11:19261parcourir

Why Does This Loop Overflow and Produce Unexpected Output?

Pourquoi cette boucle produit-elle un "avertissement : l'itération 3u invoque un comportement non défini" et génère plus de 4 lignes ?

Le code en question :

#include <iostream>

int main()
{
    for (int i = 0; i < 4; ++i)
        std::cout << i * 1000000000 << std::endl;
}

génère l'avertissement suivant :

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i * 1000000000 << std::endl;
                  ^

Cet avertissement provient d'un débordement d'entier signé qui se produit dans l'instruction :

i * 1000000000

La multiplication de i (un type de données int) par 1 000 000 000 entraîne un débordement d'entier car 1 000 000 000 est trop grand pour tenir dans la plage d'un variable entière. Par conséquent, la valeur de i devient indéfinie et toute opération ultérieure sur i (telle que sa sortie sur la console) peut produire des résultats inattendus.

Dans ce cas spécifique, la boucle continue d'itérer et produit une sortie au-delà de la valeur prévue. quatre itérations car la condition de boucle i < 4 est évalué à vrai. Cependant, en raison du dépassement d'entier, la valeur i est corrompue et la boucle continue d'itérer jusqu'à ce que le tampon de sortie soit plein.

Pour résoudre ce problème, vous devez soit ajuster la condition de fin de la boucle pour tenir compte de le débordement ou utilisez un type de données entier suffisamment large pour gérer le résultat de la multiplication.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn