Russian Qt Forum
Март 28, 2024, 14:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Итераторы  (Прочитано 26123 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #45 : Апрель 21, 2021, 12:17 »

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

К сожалению, тесты никак не оценивают инициативность, способность находить решения и многое другое, тупенькое "знание справочника" обычно рулит Плачущий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #46 : Апрель 21, 2021, 13:31 »

В 2ГИСе мы спрашивали похожую задачку
std::cout << f() << f() << f() << std::endl;

где f() имеет сайд-эффект (делает i++)

никто не решил (я в том числе)
Нужно было вспомнить, что эта запись сахар для такой Улыбающийся
Код
C++ (Qt)
std::cout.operator<<( f() ).operator<<( f() ).operator<<( f() ).operator<<( std::endl );
 
А они всегда выполняются слева направо, т.к. здесь следующий оператор всегда применяется к результату предыдущего.

А вот с boo( f(), f(), f() ), не все так однозначно и, если мне не изменяет память, это отдается на откуп компилятора. Как правило f() будет вызываться справа налево, по крайней мере я не знаю ни одного компилятора, у которого это не так.
« Последнее редактирование: Апрель 21, 2021, 13:33 от Old » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #47 : Апрель 21, 2021, 15:15 »


Нужно было вспомнить, что эта запись сахар для такой Улыбающийся
Код
C++ (Qt)
std::cout.operator<<( f() ).operator<<( f() ).operator<<( f() ).operator<<( std::endl );
 


Да, но нет, это не члены класса а свободные функции:

Код
C++ (Qt)
operator<<(operator<<(operator<<(operator<<( std::cout, f() ), f() ),  f() ), std::endl );
 
и что выполнится вначале - operator<<( std::cout, f() ) или f() - бабка надвое сказала
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Апрель 21, 2021, 15:22 »

Вспомнилось что когда-то весьма усердно изучалось нечто вроде
Цитировать
Pascal передает параметры слева направо, стек очищает сама ф-ция. А вот С - справа налево и стек очищает вызывающий. Поэтому можно передавать переменное число параметров и.т.д и.т.п. (потом еще для калбэков надо было учитывать)
Ну может какой-то смысл в этом и есть, но в принципе это совершенно бесполезное забивание головы всякой фигней  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #49 : Апрель 21, 2021, 15:22 »

Да, но нет, это не члены класса а свободные функции:
А у какого компилятора operator<< это свободная функция?
У gcc и clang это члены класса. Даже у msvc это член класса.

и что выполнится вначале - operator<<( std::cout, f() ) или f() - бабка надвое сказала
Что вначале выполниться boo или f? Улыбающийся
Код
C++ (Qt)
boo( f() );
 

а здесь:
Код
C++ (Qt)
auto &os1 = std::cout.operator<<( f() );
auto &os2 = os1.operator<<( f() );
auto &os3 = os2.operator<<( f() );
auto &os4 = os3.operator<<( std::endl );
 

Даже в вашем варианте порядок вызовов четко определен. Улыбающийся
« Последнее редактирование: Апрель 21, 2021, 16:05 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #50 : Апрель 21, 2021, 15:23 »

Вспомнилось что когда-то весьма усердно изучалось нечто вроде
Цитировать
Pascal передает параметры слева направо, стек очищает сама ф-ция. А вот С - справа налево и стек очищает вызывающий. Поэтому можно передавать переменное число параметров и.т.д и.т.п. (потом еще для калбэков надо было учитывать)
Ну может какой-то смысл в этом и есть, но в принципе это совершенно бесполезное забивание головы всякой фигней  Улыбающийся
Да-да, продолжайте наблюдение. Улыбающийся
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #51 : Апрель 21, 2021, 16:33 »

Кстати, при прочих равных (когда нет выделения общих вычислений на аргументах) на практике соглашение о вызове по идее должно коррелировать с порядком вычисления аргументов - тот, который пушим первым первым и вычисляем, но не вычисляем первым аргумент из середины, т.к. его нельзя сразу запушить. Но, например, при register calling convension то, что будет передаваться в регистрах можно вычислять в любом порядке. Так что вариаций много.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #52 : Апрель 21, 2021, 16:37 »

Кстати, при прочих равных (когда нет выделения общих вычислений на аргументах) на практике соглашение о вызове по идее должно коррелировать с порядком вычисления аргументов - тот, который пушим первым первым и вычисляем, но не вычисляем первым аргумент из середины, т.к. его нельзя сразу запушить. Но, например, при register calling convension то, что будет передаваться в регистрах можно вычислять в любом порядке. Так что вариаций много.
Как я помню, это отдается на откуп компилятора. Поэтому может быть что угодно, закладываться на это нельзя.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #53 : Апрель 21, 2021, 17:00 »

Даже в вашем варианте порядок вызовов четко определен. Улыбающийся

Ну вот gcc 4.6 печатает "210", а 10.3 печатает "120" https://godbolt.org/z/Pc9fa4bf9
Там в целом были какие-то изменения в с++11, но яхз, поправлено это или "везет" что все новые компиляторы печатают одинаково.

Что вначале выполниться boo или f? Улыбающийся

вот только оператор (даже член класса) это функция от двух аргументов
Код:
foo(f(), g());
не понимаю почему функция-член класса гарантирует что "this" вычисляется первым. где это написано?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #54 : Апрель 21, 2021, 17:08 »

И как вы предполагали - какой Rand будет вызван первым - левый или правый?

В 2ГИСе мы спрашивали похожую задачку
std::cout << f() << f() << f() << std::endl;

где f() имеет сайд-эффект (делает i++)

никто не решил (я в том числе)


И в чём проблема? Это пайплайн. Он должен выполняться строго слева направо (ибо в этом его суть) и никак иначе. Сайд-эффект в чём?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #55 : Апрель 21, 2021, 17:09 »

Ну вот gcc 4.6 печатает "210", а 10.3 печатает "120" https://godbolt.org/z/Pc9fa4bf9
Вот два скрина, в обоих случаях вроде 012?
Увидел где 210.


вот только оператор (даже член класса) это функция от двух аргументов
Код:
foo(f(), g());
не понимаю почему функция-член класса гарантирует что "this" вычисляется первым. где это написано?
Ну и что, что два аргумента. В этом операторе нам не важно, какая функция будет выполнена первой operator<<( this(), f() )
« Последнее редактирование: Апрель 21, 2021, 17:14 от Old » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #56 : Апрель 21, 2021, 17:11 »

у вас в обоих случаях 10.3 (см правый pane)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #57 : Апрель 21, 2021, 17:22 »

Да, жесть. Нужно быть осторожным. Улыбающийся

За такое, конечно нужно яйца откручивать gcc-шникам. Улыбающийся
Спасибо хоть gcc с 7.1 начал нормальный код генерить.
« Последнее редактирование: Апрель 21, 2021, 17:37 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #58 : Апрель 21, 2021, 17:56 »

И в чём проблема? Это пайплайн. Он должен выполняться строго слева направо (ибо в этом его суть) и никак иначе. Сайд-эффект в чём?
В том, что gcc до 7.1 лажал и генерировал шляпу. Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #59 : Апрель 21, 2021, 23:30 »

И в чём проблема? Это пайплайн. Он должен выполняться строго слева направо (ибо в этом его суть) и никак иначе. Сайд-эффект в чём?
В том, что gcc до 7.1 лажал и генерировал шляпу. Улыбающийся

А. Тогда стыдно им всем. Должно бы быть...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 23.