2016-06-25 1 views
2

Ceci est une application de console en Visual Studio et donc je voulais voir ce qui s'est passé si j'ai appelé un cout dans un cout. Et ça marche un peu mais ça enlève un personnage qui est un peu bizarre. Donc, il supprime la quantité de caractères de la string dans le cout dans le main. Donc, il supprime autant de caractères à la valeur du retour de la fonction doPrint().C++ string cout caractère perdu

Exemple: si la valeur de retour est 1, il affichera « AAAAABLLLLLLLLLL » si la valeur de retour est de 2 sortie sera « AAAAALLLLLLLLLL »

#include "stdafx.h" 
#include <iostream> 

int doPrint() 
{ 
    std::cout << "AAAAA" << std::endl; 
    return 1; 
} 

int main() 
{ 
    std::cout << "BBLLLLLLLLLL" + doPrint() << std::endl; 
    int x; 
    std::cin >> x; 
    return 0; 
} 

Ce n'est pas un gros problème mais je aimerait savoir pourquoi cela arrive. Merci déjà.

P.S: Je sais que je devrais faire << au lieu de +

+1

' "BBLLLLLLLLLL" + DoPrint()' ne certainement pas ce que vous pourriez être pensez. Lisez à propos de aritmethics pointeur. –

+1

Cela peut être simplifié en 'int main() {std :: cout <<" ABC \ n "+ 1; } ' – melpomene

Répondre

1

Eh bien, au fond ce qui se passe est l'arithmétique des pointeurs et de l'ordre d'évaluation spécifié des appels de fonction.

"BBLLLLLLLLLL" + doPrint() 

Alors

"BBLLLLLLLLLL" + 1 

cède

BLLLLLLLLLL 

et

"BBLLLLLLLLLL" + 2 

rendements

LLLLLLLLLL 

avec std::cout.

Il applique l'arithmétique des pointeurs de fonction avec le tableau de caractères littérale, et « desserre » caractères, comme doPrint() cède quelque chose plus grand que 0.

La priorité de l'opérateur de + est supérieur à <<, d'où doPrint() est appelé en premier et imprime AAAAA. Ainsi, votre staement

std::cout << "BBLLLLLLLLLL" + doPrint() << std::endl; 

ventile à

  1. appel doPrint()
    1.1. appelez std::cout << "AAAAA" << std::endl;
  2. appel "BBLLLLLLLLLL" + 1 de la valeur du résultat de doPrint()
  3. appel std::ostream& operator<<(std::otream&, const char*)
  4. appel std::endl
+0

merci belle réponse a un sens un peu: D – Boopy

+0

@ user4568696 Eh bien, pour vraiment obtenir il a bumpé comme une réponse _nice_ il faudra encore 10 upvotes en ce moment :-P ... –

+0

Je ne peux pas encore vaincu désolé: ( – Boopy