3 votes

Question très basique sur la concaténation de variables entières et de chaînes de caractères à l'aide de "+" en C++.

Je suis novice en C++, et cette question va probablement paraître triviale à beaucoup, mais gardez à l'esprit que je débute dans le langage C++.

J'ai attribué une variable x à égalité 20 et souhaite le concaténer avec une chaîne de caractères. Mon code C++ est le suivant.

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main() {
  int x = 20;
  int y = 15;
  if (x >= y) {
    cout << x + " is greater than " + y;
  }
}

Le résultat que j'attends est le suivant 20 is greater than 15 mais ce qui apparaît à la place, c'est une sorte d'étrange é@ . Je suis confus, et je n'ai pas trouvé de solution sur GeeksForGeeks, w3schools, ou le reste de SO.

Je comprends que l'utilisation de cout << x << " is greater than " << y; fonctionne parfaitement, mais je ne sais pas pourquoi la concaténation ne fonctionne pas ici. De plus, pourquoi ces caractères bizarres sortent-ils à la place ?

Merci d'avance.

(Par ailleurs, ne laissez pas de réponse sans avoir répondu à la question. Je me souviens qu'au début des JS, j'ai posé une question et que la seule réponse était "n'utilisez pas". document.write ." Bien que je comprenne cela, il serait bien mieux de réellement répondre la question et de la mettre en marge).

5voto

Arcinde Points 358

La raison pour laquelle vous obtenez des résultats bizarres est liée au fait que le C++ est une évolution du C. Dans l'expression x + " is greater than " + y l'expression " is greater than " est un const char* qui est un type brut de type C. Il ne s'agit pas d'un type de classe C++ comme std::string pour des raisons de compatibilité ascendante.

Su + Les signes ajoutent des nombres entiers à un const char* . Il en résulte une arithmétique de pointeurs. En principe, " is greater than " être un const char* Il s'agit d'un pointeur vers une mémoire tampon dont le contenu est constitué d'octets ASCII. " is greater than " . L'effet de l'ajout de x y y consiste à déplacer le pointeur vers la droite de 35 octets, où il ira jusqu'à la fin du tampon et lira de la mémoire non initialisée. C'est ce que l'on appelle les "caractères bizarres" qui sortent. A proprement parler, il s'agit d'un comportement non défini, donc tout peut arriver. Dans les systèmes réels, cependant, il s'agira simplement d'un débordement de tampon qui se traduira par des caractères bizarres.

Comme d'autres l'ont fait remarquer, un moyen de remédier à ce problème serait d'utiliser std::to_string sur les entiers. Ensuite, au lieu de int + const char* + int vous obtiendrez std::string + const char* + std::string qui est beaucoup mieux gérée.

Si cela n'est pas clair, vous pouvez consulter les pointeurs, les chaînes de style C et les débordements de mémoire tampon pour plus d'informations.

Edit : Techniquement parlant, les chaînes de caractères littérales sont const char[] mais je l'ai omis par souci de clarté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X