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
Libérer: 2024-12-02 18:11:19
original
257 Les gens l'ont consulté

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;
}
Copier après la connexion

génère l'avertissement suivant :

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i * 1000000000 << std::endl;
                  ^
Copier après la connexion

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

i * 1000000000
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal