Задачка с башорга

AmdY

Пью пиво
Команда форума
++i++ + i;
(1+5)+1 + (1+5+1 ) = 14;
---------------------------------------
а такой вариант имеет право на жизнь?
 

AnToXa

prodigy-одаренный ребенок
да, и насчет STL - расшифровыывается как Standard Template Library, определена(интерфейс + observable behavour) в стандарте, т.е. она стандартная и по названию и по сути. никак не является внешней, и разработчики компиляторов вольны реализовывать ее как им угодно, хоть все в компилятор встроить.
 

AnToXa

prodigy-одаренный ребенок
romy4
кто она? stl ? да там выше просто обсуждали, запомнилось :)
 

dark-demon

d(^-^)b
мы и говорим о де-факто. то, что является перегрузкой оператора - уже не есть стандартной операцией
откуда вдруг взялась перегрузка? перегрузка - это изменение функции в дочернем классе. определение операторов для одинокого класса - это именно определение, а не перегрузка.
 

AnToXa

prodigy-одаренный ребенок
откуда вдруг взялась перегрузка? перегрузка - это изменение функции в дочернем классе. определение операторов для одинокого класса - это именно определение, а не перегрузка.
оно называется в стандарте "operator overloading", что канонически переводится как "перегрузка операторов".
 

dark-demon

d(^-^)b
компилятор волен хоть код для полета на луну сгенерить.
глупость. компилятор волен случаи не определённые стандартом интерпретировать в соответствии со своим видением стандарта, а не форматировать пользователю винчестер. то есть он должен выполнить все указанные в программе операции (два инкремента и сложение, а не форматирование и построение графика полёта этого компилятора на луну, когда пользователь увидит результат его работы), которые должны выполняться так, как определено в стандарте.
 

romy4

invoke [brain]
dark-demon
вы знакомы с перегрузкой операторов? любое изменение стандартного действия оператора или определение нового типа действия (как, например для классов) называется перегрузкой оператора.
 

AnToXa

prodigy-одаренный ребенок
dark-demon
гхм, а кто определяет критерии грамотности? вы?

-~{}~ 15.05.07 16:07:

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

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

кстати, насколько я помню, для данного случая (undefined behaviour для инкрементов простых) есть defect-report, который предлагает поменять undefined -> unspecified, что в общем-то разумно и на практике так и есть.
 

dark-demon

d(^-^)b
гхм, а кто определяет критерии грамотности? вы?
русский и соответственно английский языки. пере-грузка означает "загрузка поверх чего-то". в английском аналогично.
это всё-равно, что называть запуск программы "перезагрузкой".

глупость - это обсуждать то в чем вы совершенно не разбираетесь.
глупость - это полагать, что кроме стандарта ничего нет. есть такие понятия, как "обеспечение совместимости" и "идеология языка".
яркий пример первого - это реализация quirks mode в браузерах для страниц не соответствующих стандарту.
со вторым несколько сложнее - каждый представляет себе правильное поведение иначе. но уж точно никто не представляет себе правильное поведение ввиде форматирования винчестера.
 

AnToXa

prodigy-одаренный ребенок
глупость - это полагать, что кроме стандарта ничего нет.
вообще, имхо, было бы напротив просто замечательно, если бы "кроме стандарта ничего не было", т.е. все реализации соответствовали стандарту на 100%, это было бы чрезвычайно удобно.
но разговор-то изначально был про "сколько будет в результате", а эта дискуссия имеет смысл либо для конкретной версии конкретной реализации с конкретными настройками на конкретном железе, или портабельно в контексте стандарта, т.е. "как оно должно быть везде". на мой взгляд обсуждение реализаций в данном случае смысла не имеет.
идеология языка как раз во всей красе проявляется в этом пункте, а именно: дать максимум свободы компилятору и you don't pay for what you don't use.
в данном случае это проявляется в ограничениях налагаемых на программы.

но уж точно никто не представляет себе правильное поведение ввиде форматирования винчестера.
конечно, именно поэтому я и написал про defect report.
 

romy4

invoke [brain]
dark-demon
по-моему вполне нормальный термин "перегрузка оператора". есть стандартный оператор и есть перегрузка т.е. добавление возможносте _поверх_ стандартных.
вы уже придалбываетесь к словам. ваше право, можете изменять стандарт. получится - примем (по крайней мере я) ваш термин

AnToXa
дарк-демон прав на счет того, что если в стандарте написано "результат не определен", то это вовсе не значит, что надо выполнять ещё какие-либо действие, не относящиеся к написаному коду. если написано 1+1 то это и надо выполнить. если результат 1+1 не определен, то ответом может быть хоть 2 хоть 3, но никак не означает что надо ещё выполнять 5+6+7+8
 

AnToXa

prodigy-одаренный ребенок
русский и соответственно английский языки. пере-грузка означает "загрузка поверх чего-то". в английском аналогично.
это всё-равно, что называть запуск программы "перезагрузкой".
это вам к филологам, я лишь рассказываю про устоявшиеся термины.
 

romy4

invoke [brain]
AnToXa
в лучшем случае было б вывести fatal error с просьбой переписать выражение, вместо применение неизвестных програмеру действий (на крайний случай варнинг с описанием замененных действий)
 

AnToXa

prodigy-одаренный ребенок
romy4
ну я же написал определение из стандарта! по буквам еще раз?
стандарт определяет термин undefined behaviour именно так, ваши личные мысли на тему в стандарте не отражены.

найти pdf с текстом стандарта можно на http://anatolix.naumen.ru, читайте пункт 1.3.12 Undefined Behaviour

-~{}~ 15.05.07 16:40:

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

в данном случае вывести варнинг возможно, но я не знаю ни одного компилятора который так делает.
да и зачем, это ведь настолько бросающаяся в глаза штука.
 

romy4

invoke [brain]
AnToXa
даже если компилятор компилит либу и встречает в выражении инкремент переменной более чем 1 раз, то можно было бы выводить ошибку. и я не говорю про компилятор с ИИ, это обычная "штатная" ситуация.
бывает такая штука как указатели и компилятор просто не имеет права делать некоторые выводы о том что меняется
само собой. а в примере сабжа и не было указателей.

в данном случае вывести варнинг возможно, но я не знаю ни одного компилятора который так делает.
да и зачем, это ведь настолько бросающаяся в глаза штука.
думаю, что вы понимаете смысл варнингов, так зачем говорите глупость?
 

StUV

Rotaredom
вот блин спецы-писатели-компиляторов собрались
похоже тема из интересного флейма превращается во флейм тупой и бессмысленный
 

AnToXa

prodigy-одаренный ребенок
даже если компилятор компилит либу и встречает в выражении инкремент переменной более чем 1 раз, то можно было бы выводить ошибку.
для самых базовых случаев - да.

думаю, что вы понимаете смысл варнингов, так зачем говорите глупость?
хм, ну кому глупость, а кому и нет, я не очень понятно выразился наверное, мне этот варнинг не нужен, но я не буду против если он будет существовать.

-~{}~ 15.05.07 16:59:

StUV
хм, мне казалось, что тут народ знания новые приобретает, разве нет? :)
 
Сверху