2013-03-06 6 views
1

Когда я пытаюсь использовать cout, он выводит случайное число, а не предложение, которое я хочу. Ошибка компилятора, программа работает нормально.cout weird output

Вот мой код:

//question.h 
#ifndef _QUESTION_H_ 
#define _QUESTION_H_ 

using namespace std; 
int first() 
{ 
    cout<<"question \n"; 
    return 0; 
} 

#endif 

//main.cpp 
#include <iostream> 
#include "question.h" 

using namespace std; 

void main(){ 
    cout<<""<<first<<""<<endl; 
    cin.ignore(); 
    cin.get(); 
} 

Я довольно новый для написания своих собственных заголовочных файлов, так что я не уверен, если я сделал что-то неправильно с этим или, если есть проблема с Visual Studio.

+2

первых() возвращает Int но некоторый поток инъекционным ... Я даже не знаю, что произойдет, если он делает то, что вы думайте, что вы собираетесь это делать. –

+0

@GradyPlayer, действительно. Вот пример, когда вывод из функции первый: http://liveworkspace.org/code/3RyOu1%243 – chris

+0

Отличный пример @chris, мне было интересно, будет ли этот буфер сначала покраснеть ... Или если он сначала вызвал место регистрации/tmp перед другой операцией потока. –

ответ

5

Вы печатаете адрес функции. Вы должны назвать его:

cout<<""<<first()<<""<<endl; 
       ^^ 

Как уже упоминалось в комментариях, это не должно выводить то, что вы ожидаете, либо. Порядок, в котором аргументы функций (и это всего лишь куча вызовов функций) не указан, поэтому выход вашей функции может быть в любой позиции, которую выбирает компилятор. Чтобы это исправить, поставить отдельные заявления:

cout<<""; 
cout<<first(); //evaluated, so output inside first() printed before return value 
cout<<""<<endl; 

Это не вопрос с пустыми строками, но это будет, когда вы заменить тех, кто чем-то видимым.

Кроме того, не используйте void main. Использовать int main() или int main(int, char**) (see here). Не используйте using namespace std;, особенно в заголовках, так как у std есть много дерьма, в которое втянуто это утверждение, что приводит к легким и запутанным конфликтам (see here). Наконец, выберите имя, которое не конфликтует с identifiers reserved for the implementation как ваш защитник.

+0

В коде OP нет проблемы с порядком оценки. Если исправлено вызывать 'first' вместо того, чтобы просто принимать его адрес, на него можно положиться на' '@question \ n0 # $' где '@' - пустая строка слева от 'first',' # '- это пустая строка справа, а '$' - 'endl'. Но я думаю, что это означало * для печати только '@question \ n # $' - OP, похоже, подумал, что именно так вы пишете элемент, похожий на «манипулятор», как элемент iostream. – zwol

1

Вы печатаете адрес функции first, а не вызываете его. Но изменение вызова функции не решит вашу проблему самостоятельно, потому что first записывает в cout внутренне, а затем возвращает число, которое будет напечатано, что не похоже на то, что вы хотите.

Если вы хотите, чтобы first действовал как <iomanip> thingie, вам нужно перепрыгнуть через еще несколько обручей - прочитайте этот заголовок, чтобы посмотреть, как это делается.

0

Использование cout<<""<<first()<<""<<endl; вам нужно на самом деле вызвать функцию, а не печатать его адрес