Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по потоку вывода 
:(
    Опции темы
Selat
Дата 4.7.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 3.6.2012

Репутация: нет
Всего: нет



Код

#include <iostream>
#include <windows.h>

using namespace std;

int fn()
{
    cout << "Hello from fn()!\n";
    return 5;
}

int main(int argcs, char* pArgs[])
{
    cout << "The result is " << fn() << "\n";
    system("pause");
    return 0;
}

Почему сначала выводится "Hello from fn()", и только потом "the result is 5"?

Да, кстати, ещё один вопрос: зачем в С++ типы long и long double? По крайней мере на большинстве 32-х битных системах ведь ничем не отличаются соответственно от int и double?
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Selat @  4.7.2012,  13:32 Найти цитируемый пост)
Почему сначала выводится "Hello from fn()", и только потом "the result is 5"?

это шутка такая? smile 
а в каком ЯП это не так?

Добавлено через 56 секунд
Цитата(boostcoder @  4.7.2012,  14:01 Найти цитируемый пост)
а в каком ЯП это не так?

в функциональном, по идее..
PM WWW   Вверх
Selat
Дата 4.7.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 3.6.2012

Репутация: нет
Всего: нет



Объясните пожалуйста мне, непонимающему, почему такой порядок? Ведь первым стоит "The result is"?
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



потому что вся эта строка - одна рекурсивная инструкция. и для того чтоб она(инструкция) выполнилась, необходимо сначало выполнить все использующиеся в ней операции/вызовы.

PM WWW   Вверх
Selat
Дата 4.7.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 3.6.2012

Репутация: нет
Всего: нет



Спасибо! А ответите на второй вопрос?

Это сообщение отредактировал(а) Selat - 4.7.2012, 14:18
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



во-первых - потому что С/С++ не только на 32ух битных системах.
во-вторых - потому что некоторые реализации имеют отличие в размере лонга и инта.
в-третиьх - потому что код на С/С++ иногда пишется с расчетом на несколько платформ/разрядностей.

PM WWW   Вверх
baldina
Дата 4.7.2012, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(boostcoder @  4.7.2012,  14:01 Найти цитируемый пост)
в функциональном, по идее

там встречается, но не только там. это так в любом случае ленивой передачи параметров (например, смоделированной перегрузкой операций в C++)
Цитата(boostcoder @  4.7.2012,  14:12 Найти цитируемый пост)
 вся эта строка - одна рекурсивная инструкция

нет тут рекурсии.
есть просто вызов функции, в которую передается результат вызова fn(). т.е. fn() вызывается перед этой строчкой, и её вывод появляется раньше.
PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(baldina @  4.7.2012,  18:07 Найти цитируемый пост)
нет тут рекурсии.

Код

operator<<(operator<<(operator<<()))

PM WWW   Вверх
baldina
Дата 4.7.2012, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



boostcoder, Вы меня, конечно, простите, но это не рекурсия))))

Добавлено через 5 минут и 31 секунду
рекурсия - самоподобие
Код

f := f(x)


сравните с 
Код

g := x
f := g(g(g(y)))

PM MAIL   Вверх
boostcoder
Дата 4.7.2012, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(baldina @  4.7.2012,  18:55 Найти цитируемый пост)
Вы меня, конечно, простите, но это не рекурсия

ну да, не рекурсия) я просто не мог вспомнить как это называется.

PM WWW   Вверх
math64
Дата 5.7.2012, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Это функция с побочным эффектом. Результат зависит от того, какой порядок вычислений выберет компилятор.
Так:
Код

    int res = fn();
    ostream&os = cout << "The result is ";
    os = os << res;
    os << "\n";

Или так:
Код

    ostream&os = cout << "The result is ";
    int res = fn();
    os = os << res;
    os << "\n";



Это сообщение отредактировал(а) math64 - 5.7.2012, 07:47
PM   Вверх
bsa
Дата 16.7.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(math64 @  5.7.2012,  08:44 Найти цитируемый пост)
 Результат зависит от того, какой порядок вычислений выберет компилятор.

в данном случае, стандарт языка четко определяет порядок. Но если в той строчке будет второй вызов аналогичный fn(), то тут уже могут быть варианты.
PM   Вверх
korian
Дата 16.7.2012, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



Цитата(bsa @  16.7.2012,  16:39 Найти цитируемый пост)
в данном случае, стандарт языка четко определяет порядок. Но если в той строчке будет второй вызов аналогичный fn(), то тут уже могут быть варианты.

разве тут четкий порядок?
на сколько я понимаю
Код

cout << "The result is " << fn() << "\n";

эквиваленто этому:
Код

operator <<(operator <<(cout, "The result is "), fn());

и если я прав, то тут одному компилятору известен порядок вычисления аргументов.
или где-то я не прав?


Это сообщение отредактировал(а) korian - 16.7.2012, 22:40
PM   Вверх
bsa
Дата 16.7.2012, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



точно. похоже, не прав был я. Что-то не разглядел... старею.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.