2016-06-25 3 views
2

Это консольное приложение в Visual Studio, поэтому я хотел посмотреть, что произошло, если я позвонил cout в cout. И он работает любопытно, но он удаляет характер, который является странным. Поэтому он удаляет количество символов из string в cout в main. Таким образом, он удаляет столько символов, сколько нужно для возврата функции doPrint().C++ string cout character lost

Пример: если возвращаемое значение равно 1 он будет выводить «AAAAABLLLLLLLLLL» если возвращаемое значение 2 он будет выводить «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; 
} 

Это не то, что большое дело, но я хотел бы знать, почему это происходит. Спасибо.

P.S: Я знаю, что я должен делать << вместо +

+1

' "BBLLLLLLLLLL" + doPrint()', конечно, не делать то, что вы можете быть думаю, что это делает. Читайте об указателе aritmethics. –

+1

Это можно упростить до 'int main() {std :: cout <<" ABC \ n "+ 1; } ' – melpomene

ответ

1

Ну, в основном то, что происходит, является указателем арифметика и указан порядок вычисления вызовов функций.

"BBLLLLLLLLLL" + doPrint() 

Так

"BBLLLLLLLLLL" + 1 

дает

BLLLLLLLLLL 

и

"BBLLLLLLLLLL" + 2 

урожайности

LLLLLLLLLL 

с std::cout.

Он применяет функцию арифметику указателей с массивом символов буквального и «теряет» символов, а doPrint() дает нечто большее, чем 0.

Оператор Приоритет + выше, чем <<, следовательно, doPrint() называется первым и печатает AAAAA. Так что ваш staement

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

рассыпается на

  1. вызова doPrint()
    1.1. звоните std::cout << "AAAAA" << std::endl;
  2. вызов "BBLLLLLLLLLL" + 1 от значения результата от doPrint()
  3. вызова std::ostream& operator<<(std::otream&, const char*)
  4. вызова std::endl
+0

спасибо, хороший ответ имеет смысл: D – Boopy

+0

@ user4568696 Ну, чтобы на самом деле это получилось как _nice answer_, в это время ему понадобится еще 10 upvotes: -P ... –

+0

Я не могу еще простить: ( – Boopy