Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que je reçois un avertissement « comparaison entre les expressions entières signées et non signées » en C ?

Pourquoi est-ce que je reçois un avertissement « comparaison entre les expressions entières signées et non signées » en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-10 13:00:03727parcourir

Why do I get a

Avertissement : Comparaison entre les expressions entières signées et non signées

Introduction

Pendant le travail sur l'exercice 2-3 de "Accelerated C", un utilisateur a rencontré un avertissement du compilateur : "comparaison entre les signatures et des expressions entières non signées. Ce problème survient lors de la comparaison d'entiers signés (int) à string::size_type, un type de données couramment utilisé pour les longueurs de chaînes.

Cause de l'avertissement

L'avertissement se produit car les types entiers signés et non signés ont des plages différentes. Lorsque l'on compare ces types, le résultat peut être inattendu. Les compilateurs émettent cet avertissement pour alerter les programmeurs du risque de confusion des résultats.

Pratique recommandée

Pour éviter ce problème, il est conseillé de spécifier explicitement si les entiers sont signés ou non signé. Lorsque vous comparez des entiers à des longueurs de chaîne ou à d'autres valeurs non signées, déclarez les entiers comme entier non signé ou size_t pour correspondre au type de données comparé. Cela garantit que la comparaison donne les résultats escomptés.

Exemple de code

Dans le code fourni, padtopbottom doit être déclaré comme unsigned int pour correspondre à la variable string::size_type c:

unsigned int padtopbottom;
cin >> padtopbottom;

unsigned int padsides;
cin >> padsides;

if (r == padtopbottom + 1 && c == padsides + 1) {
    // ...
}

Supplémentaire Notes

  • En déclarant les entiers comme non signés, vous évitez la possibilité d'un comportement inattendu lors de leur comparaison avec des longueurs de chaîne.
  • Le type exact à utiliser pour la comparaison dépend du type de données avec lequel vous travaillez.
  • Dans le cas de Linux Mint, string::size_type est généralement défini comme unsigned int, ce qui rend la comparaison sûr. Cependant, il est toujours de bonne pratique de déclarer explicitement les entiers.
  • Le livre "Accelerated C" couvre des sujets liés à la gestion des types de données, mais peut ne pas fournir une explication complète sur les comparaisons entre les types signés et non signés.

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