|
1 / 1 / 0
Регистрация: 31.07.2014
Сообщений: 55
|
|||||||||||
Вывод результата несколько раз отработанной функции в одну строку12.05.2016, 00:31. Показов 6124. Ответов 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
|
|
|
Вездепух
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
|
||
| 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 использовать несколько раз?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|