|
1 / 1 / 0
Регистрация: 31.07.2014
Сообщений: 55
|
|||||||||||
Вывод результата несколько раз отработанной функции в одну строку12.05.2016, 00:31. Показов 6205. Ответов 16
Метки нет (Все метки)
Очень интересный момент нашел я для себя сегодня в С++.
А точнее в выводе средствами iostream Прошу Вас объяснить, что происходит. Код простой, объяснять не буду
Если вызывать cout'ы следующим образом, все нормально:
Я так понимаю это связано с особенностью обработки функций на уровне ассемблера, и результат возвращающийся из функции идет в стек, а потом поэлементно оттуда достается? Прошу объяснить, очень хочется понять как все это правильно происходит. Заранее спасибо! P.S: Два часа голову ломал, пока не обнаружил, что ошибка в выводе
0
|
|||||||||||
| 12.05.2016, 00:31 | |
|
Ответы с готовыми решениями:
16
|
|
18 / 17 / 22
Регистрация: 03.05.2016
Сообщений: 105
|
|
| 12.05.2016, 00:36 | |
|
Из-за приоритета, есть в книге Кернигана и Ритчи
для данного оператора справа налево, поэтому так и выводит Добавлено через 45 секунд Операторы Выполняются () [] -> . слева направо ! ~ ++ -- + - * & (тип) sizeof справа налево * / % слева направо + - слева направо << >> слева направо < <= > >= слева направо == != слева направо & слева направо ^ слева направо | слева направо && слева направо || слева направо ?: справа налево = += -= *= /= %= &= ^= |= <<= >>= справа налево , слева направо
0
|
|
|
1 / 1 / 0
Регистрация: 31.07.2014
Сообщений: 55
|
||||||
| 12.05.2016, 00:40 [ТС] | ||||||
|
Извините, Вы сами написали в списке, что для << и >> слева направо
А для >>= или <<= и им подобных это я понимаю, справа налево ![]() А также, если смотреть выражение:
Подозреваю, что дело все таки в правильном вычислении функций и стэке.
0
|
||||||
|
18 / 17 / 22
Регистрация: 03.05.2016
Сообщений: 105
|
|
| 12.05.2016, 00:45 | |
|
ща гляну
0
|
|
|
56 / 56 / 44
Регистрация: 24.03.2016
Сообщений: 378
|
||||||
| 12.05.2016, 00:46 | ||||||
0
|
||||||
| 12.05.2016, 00:49 [ТС] | |
|
Не по теме: Поэтому тему и создал)
0
|
|
|
18 / 17 / 22
Регистрация: 03.05.2016
Сообщений: 105
|
|
| 12.05.2016, 00:58 | |
|
Тоже склоняюсь, что дело в порядке помещения в стек
Последним пришёл - первым ушёл вычисляется в порядке 5, потом накладывается 6 и т.д. Потом выводятся значения по порядку, поэтому в самом верху стека лежит последнее вычисление. Т.к. если всунуть слово между ф-циями, оно появляется где надо
0
|
|
|
18 / 17 / 22
Регистрация: 03.05.2016
Сообщений: 105
|
|
| 12.05.2016, 01:14 | |
|
Mr.X, чего не знал того не знал, признаю)
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
||
| 12.05.2016, 01:44 | ||
Сообщение было отмечено Ilot как решение
Решение?: или ,, с ясно оговоренной упорядоченностью).Язык С++ гарантирует, что перегруженные операторы << буду вызываться по порядку, слева направо. Однако в каком порядке будут подготавливаться операнды для этих вызовов (т.е. делаться индивидуальные вызовы foo()) - не оговаривается. Поэтому никакого формально предсказуемого порядка тут нет.
1
|
||
|
|
||||||||||||||||
| 12.05.2016, 12:23 | ||||||||||||||||
|
Рассмотрим код:
I'm foo1 5 I'm foo2 6 I'm foo3 7 765 Теперь разберемся, что происходит на самом деле. Сперва вызывается функция operator<< с аргументом возвращаемым функцией foo1. Однако известно, что функции члены принимают неявно первым параметром указатель this. Поэтому второй этап это получение ссылки this которая возвратиться при вызове operator << с параметром возвращаемым foo2 и т.д. Т.е. на первом этапе при отработке функции foo1 переменная i инкрементируется, что и показывает вывод "I'm foo1 5", однако в поток ничего выведено не будет так как ссылки на него operator << с параметром foo2 еще возвращено не было. Следовательно затем вызывается данный оператор и переменная i опять инкрементируется. Но снова ссылка на поток не доступна. Для ее получения требуется вызов последнего operator << с параметром возвращаемым foo3. На этом этапе переменная i опять инкрементируется и становиться равной 7. И вот наконец-то ссылка на поток получена и operator<< начинают отрабатывать. Сперва будет выведено значение возвращаемое foo3 т.е. 7, затем значение возвращаемое foo2 т.е. 6 и наконец значение возвращаемое foo1 равное 5.
2
|
||||||||||||||||
|
1 / 1 / 0
Регистрация: 31.07.2014
Сообщений: 55
|
|
| 12.05.2016, 14:09 [ТС] | |
|
Спасибо большое, тему можно закрывать на ключик
0
|
|
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||||||||||||||||
| 12.05.2016, 21:43 | |||||||||||||||||
|
В выражении
В выражении
Вычисление же аргументов в обратном порядке объясняется все тем же: порядок вычисления аргументов любой неунарной операции (кроме логических, условного оператора и запятой) стандартом НЕ ОПРЕДЕЛЕН и в конкретной реализации выполняется так, как сочтут более удобным авторы этой реализации. Операция точка (вызов функции-члена) в этом отношении не лучше любой другой. Порядок вычисления подвыражений слева и справа от этой точки тоже зависит от реализации. В приведенном ниже примере в моей реализации функции вызываются слева направо, а их аргументы вычисляются справа налево:
1
|
|||||||||||||||||
|
|
|||
| 13.05.2016, 07:37 | |||
|
operator<< принимает два аргумента, а порядок передачи параметров в функцию как известно не определен. Поэтому сперва может быть может быть найден указатель на поток, а это приведет к тому, что вывод цифр будет последователен (5678). Возможны также и смешанные варианты. f_3 f_2 f_1 T_struct f g И последнее. Впредь старайтесь, пожалуйста, быть более избирательным в выборе слов. Всегда можно вести дискуссию культурно.
0
|
|||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||
| 13.05.2016, 08:38 | |||
|
Когда в теме, где выше уже десять раз объяснено, что порядок вычисления аргументов функции не определен, человек, называющий себя экспертом, пытается доказать обратное, то первая мысль возникает, что он троллит. А вы бы что подумали? Публикуя ошибочные суждения под видом истины, вы вводите читателей в заблуждение. Один из них даже пометил это ваше сообщение как ответ. Между прочим, эта метка до сих пор не снята, сделайте хоть сами это. Если уж назвались экспертом, то полезайте в кузов, т.е. тщательнее обдумывайте свои сообщения, прежде чем публиковать.
0
|
|||
|
|
|||
| 13.05.2016, 08:51 | |||
|
0
|
|||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
||
| 13.05.2016, 19:39 | ||
|
Между тем, метку "ответ" со своего ошибочного сообщения №11 вы так и не сняли, поэтому я не в силах воспринимать ваши сообщения серьезно. Судя по тому, что остальные эксперты вообще на это сообщение не реагируют, они уже все махнули на вас рукой. Последую и я их примеру.
0
|
||
| 13.05.2016, 19:39 | |
|
Помогаю со студенческими работами здесь
17
Запустить одну форму несколько раз Построение отчета с перечисление результата в одну строку но в разные ячейки Как одну JLabel использовать несколько раз?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|