double evaluation
Вид для печати
double evaluation
Right
[QUOTE=Ull9]Ребята, вы оба неправильно ответили на этот вопрос, вы оба срезались.
итак смотрим
i=i+++i,
вы правильно разболи это на
(i++) + i,
но дальше вы допускаете оба ошибку
в соответствии с (великим, святым) стандартом языка с++.компилятор свободен в порядке вычесления левого аргумента и правого аргумента. Т.е он сначала может выполнить i++, затем i, затем сложить оба значения. А может поступить наоборот
сначала i, затем i++, затем сложить. резуьтат будет разный.
правильный ответ звучит так. эта операция даст неопределенный результат.
может 2 может 3.
все, срезались :-) учите стандарт.[/QUOTE]
интересно, я смотрел как работает gcc, не знал, что есть стандартом допускаеться неопределённость.. тогда такую конструкцию нельзя использовать в принципе, буду знать
Не контракта ради, если есть ещё пару таких задачек, напиши :)
пожалуйста,
чем [b]operator new[/b] отличается от [b]new operator[/b] и отличается ли вообще?
что быстрее
++i или i++?
есть класс
class MyStrinh
{
privat:
char* p;
int len;
public:
MyString():len(0),p(NULL){}
};
деструктор и другие методы для простоты опускаются.
Напиши copy construktor и assign operator
Ull9, Вы утверждаете, что компилятор волен в целях оптимизации выбирать порядок вычислений. Но неужели разработчики стандартов и компиляторов не подумали об этом? Если эти "особенности" стандарта и реализаций всплывают на таких элементарных конструкциях, то представляю, что может быть в более-менее навороченном коде. Теперь я понимаю, почему разработчики игрушек распространяют Debug версии своих творений - там компилятор хоть как-то управляем. А нам парят мозги, что для реализации эффектов нужны более мощьные процы, память. Relese версия просто не собирается или собирается, но не работает.
[QUOTE]это означает, что при одних обстоятельствах (контексте) при выражении
int i = foo() + boo();
сначала выполнится foo() потом boo();[/QUOTE]
Настолько мне известно, компилятор может переставить эти функции, только если уверен, что это не на что не повлияет. Не знаю, написано ли это в стандарте, но мои чтения RSDN.RU и Криса Касперски (не путать с Евгением Касперским) показали, что компилятор не хочет нарываться на неприятности и поступает естественным образом, тоесть так как ожидается (но наши ожидания не всегда совпадают с разработчиковскими :) ).[B]
Вопрос в лоб[/B]
Сами хоть раз встречались с таким поведением компилятора или нет - тоесть, что бы в одном файле он применил два разных способа. Ответы типа "одна бабка сказала" или "известный спец шепнул на ушко" не принимаются. Только исходный код для примера и скомпиленый результат. Не бойся, с дизассемблеров я умею управляться. Скомпиленый результат надо на той случай, если мой компилятор "не правильно скомпилит". pdb файл также не помешает. Пока не увижу - не поверю.
А пока все Ваши рассуждения о правильности/неправильности похожи на исследования сферического коня в вакууме.
Вадим, можно на ты.
<<Ull9, Вы утверждаете, что компилятор волен в целях оптимизации выбирать порядок вычислений. Но неужели разработчики стандартов и компиляторов не подумали об этом?>>
именно потому что об этом подумали, принято решение не накладывать ограничения на компилятор.
<<Теперь я понимаю, почему разработчики игрушек распространяют Debug версии своих творений - там компилятор хоть как-то управляем. А нам парят мозги, что для реализации эффектов нужны более мощьные процы, память. Relese версия просто не собирается или собирается, но не работает.>>
с++, не простой язык, это для больших мальчиков, этим ножечком можно и порезатся, но никто не заставляет, ты можешь поигратся в песочнице пластмассовым совочком (ява).
<<Настолько мне известно, компилятор может переставить эти функции, только если уверен, что это не на что не повлияет. Не знаю, написано ли это в стандарте,>>
ну раз ты не знаешь о чем разговор? компилятор может выполнять любой порядок, не обращая внимание на сайд -эффекты.
<<показали, что компилятор не хочет нарываться на неприятности и поступает естественным образом>> единственная неприятность для компилятора нарушить стандарт. остальное проблемы программиста.
<<Сами хоть раз встречались с таким поведением компилятора или нет - тоесть, что бы в одном файле он применил два разных способа. Ответы типа "одна бабка сказала" или "известный спец шепнул на ушко" не принимаются. Только исходный код для примера и скомпиленый результат. Не бойся, с дизассемблеров я умею управляться. Скомпиленый результат надо на той случай, если мой компилятор "не правильно скомпилит". pdb файл также не помешает. Пока не увижу - не поверю.
>>
Сам не сталкивался, Тк у меня были хорошие учителя. И что значит верю не верю. мне не надо верить, читай стандарт. Например я знаю что австралия есть, но мне и в голову не придет, поехать проверить. есть книги, я им верю.
Если ты будешь ишодить из принципа ПОKА НЕ УВИЖУ НЕ ПОВЕРЮ, то.... ты выбрал не ту профессию.
<<А пока все Ваши рассуждения о правильности/неправильности похожи на исследования сферического коня в вакууме.>>
не смеши. и больше нигде не говори, что веришь только уведенному а не написанному.
Ты не со мной споришь а со стандартом
вот нашел ISO Standard C++
Kнига 5, стих 4
Except where noted, the order of evaluation of operands of
individual operators and subexpressions of individual expressions, and
the order in which side effects take place, is unspecified.
И все. Точка. Kак выполнять решает компилятор.
Пример в тему. Kонституция Украины, тоже не определяет с какой ноги тебе утром вставать Ну и что Kонституцию в топку?
[QUOTE=Ull9]что быстрее
++i или i++?[/QUOTE]
Теоретически, ++i быстрее. так как i изменяеться по ссылке, хотя с оптимизацией компиляторов, если i типа int, разницы в производительности цикла i++ и ++i не заметил
[QUOTE=KoVadim]Сами хоть раз встречались с таким поведением компилятора или нет[/QUOTE]
тут ты сильно не прав. если твой компилятор успешно компилирует некорректные программы, это не значит что надо их писать. ты проверил все варианты параметров оптимизации ? проверил на других архитектурах ? проверил другие компиляторы ? а еще не вышедшие тоже проверил ?
между прочим, правильные компиляторы на такое ругаются
[QUOTE=Konstantin.od]Теоретически, ++i быстрее. так как i изменяеться по ссылке, хотя с оптимизацией компиляторов, если i типа int, разницы в производительности цикла i++ и ++i не заметил[/QUOTE]
правильно, но если i это POD, если это скажем итератор то разница есть, и оптимизатор ее не соптимизирует.
поэтому лучше писать ++i
[B]pal[/B]. Надо выбросить компилятор, который компилирует заведомо неверный код. Разработчиков выгнать. Ведь вы не будете доверять человеку, который один раз делает так, а на следующий - по другому.
Основная идея программирования - что мы можем точно объяснить компьютеру, что же мы хочем на понятном ему языку. Зачем стандарт, который допускает такие глупости. Я не верю, что такое пропустили. Там же не глупцы сидят.[QUOTE]проверил другие компиляторы ?[/QUOTE]
Вот завтра на работе попробую скомпилить под Linux Mandriva 2007 и FreeBSD 6.1, компилятор скорее всего gcc. версию уточню уже по месту.
По поводу других платформ - у меня нет такой возможности. Но есть идеи. Проверю - расскажу.[QUOTE]а еще не вышедшие тоже проверил ?[/QUOTE]
У меня нет машины времени :(
[QUOTE]между прочим, правильные компиляторы на такое ругаются[/QUOTE]
Опять сферические кони в вакууме. Пример в студию плиз+ссылку, откуда выкачать и проверить. Только не предлагайте такое, что нереально в Одессе сделать - типа мейнфрейме таком-то компилиться.
[QUOTE]ты проверил все варианты параметров оптимизации ? [/QUOTE]
Если Вы также уверены в том, что сказал [B]Ull9[/B], пожалуйста приготовьте пример, в котором код
[code]
int i=1;
int j=2;
int k=i+++j;
[/code]
Давал результат не 3, а 2. Для подтверждения принимаются исходники плюс скомпиленый вариант и сопутствующие файлы для отладки (ну что бы я мог убедиться что это всё не подстроено, а действительно правда). Это касается всех, кто убеждён в том, что стандарт так просто допускает двузначности.
[B]Ull9[/B]
[QUOTE]с++, не простой язык, это для больших мальчиков, этим ножечком можно и порезатся, но никто не заставляет, ты можешь поигратся в песочнице пластмассовым совочком (ява).[/QUOTE]
Типичная ошибка больших мальчиков. На java не пишу. Маленьким мальчиком себя не считаю, хотя до "больших" наверное далеко. Поэтому считаю это личным оскорблением. Вы не удосужились даже спросить на каком языке я пишу. Плюс ко всему, я обращаюсь на [B]Вы[/B], а в ответ имею [b]ты[/b].
[QUOTE]Если ты будешь ишодить из принципа ПОKА НЕ УВИЖУ НЕ ПОВЕРЮ, то.... ты выбрал не ту профессию.
[/QUOTE]
Какую я же должен был выбрать? Меня воспитали человеком, который должен проверить. А насчет Австрилии. Можно на худой конец GoogleMap посмотреть. К тому же тут есть другие доказательства - фотографии к примеру, а Вы мне даже фотографий (тобыш скомпилированого кода) не предоставили.
По поводу Конституции. Мне кажеться пример не слишком удачный - там сказано, что личные свободы не ограничиваются. Поэтому я волен с утра выбирать. И от того, с какой ноги я утром встану и результат моего рабочего дня слабо коррелированны. Но во времена Сталина могли и приписать такое. Он мог.
Так мне кто то пример кода с сопутствующими файлами приведет?
[quote]Если Вы также уверены в том, что сказал Ull9, пожалуйста приготовьте пример, в котором код
Код:
int i=1;
int j=2;
int k=i+++j;
Давал результат не 3, а 2. Для подтверждения принимаются исходники плюс скомпиленый вариант и сопутствующие файлы для отладки (ну что бы я мог убедиться что это всё не подстроено, а действительно правда). [/quote]
В этом коде нет никакой двузначности, просмотрите внимательно тот пример, для которого результат был неопределён.
[quote]
Это касается всех, кто убеждён в том, что стандарт так просто допускает двузначности
[/quote]
не думаю, что в таком вопросе можно быть 'убеждённым', стандарт либо допускает что либо нет, все закономерности вычисления - дело частного случая, на который нельзя полагаться. Сам удивился этому пару страниц назад. Впрочем, не стыдно, только учусь.
Я проверил, есть такое, ссылка на стандарт - [url]http://anatolix.naumen.ru/files/book...andard2003.zip[/url], страница 65 по бумажной нумерации. Думаю, этого достаточно, чтобы положить конец этому спору.
[QUOTE=KoVadim][/QUOTE]
ты так ничего и не понял
компилятор пытается оптимизировать код, чтобы он работал быстрее
если он не сможет переставлять местами участки, он не сможет оптимизировать. понятно, что если переставлять все, что вздумается, то оно и работать будет потом, как ему вздумается. поэтому стандарт определяет, в каких случаях компилятор свободен в выборе, а в каких нет. если бы ты внимательно изучил язык, ты бы знал, что есть sequence points, ограниченные, в частности && || , ?:
а вот + ничего не ограничивает
спор ведешь совершенно никчемный - я уже сказал, что даже если сейчас нет компилятора который скомпилирует какой-то конкретный пример с undefined behavior по другому, это не делает этот пример корректным, потому что завтра такой компилятор может появиться. и он будет соответствовать стандарту, а этот пример - нет. даже если ты будешь очень громко оспаривать существование оптимизирующих компиляторов или стандарта языка
ну, а в качестве примера
[pal@underdark tmp]$ cat a.cpp
#include <iostream>
int main ( ) {
int a = 1;
std :: cout << a + ++ a << std :: endl;
}
[pal@underdark tmp]$ g++ -o a -Wall -Werror a.cpp
cc1plus: warnings being treated as errors
a.cpp: In function ‘int main()’:
a.cpp:5: warning: operation on ‘a’ may be undefined
[B]pal[/B]
Ваш пример неудачен. Так как играя пробелом, можно получить и не такое в этом примере.
при таком варианте "a+ + +a" имеем результат 2
при таком варианте "a++ +a" имеем результат 3
при таком варианте "a+ ++a" имеем результат 4
при таком варианте "a+ + +a" имеем результат 2
при таком варианте "a+++a" имеем законную результат 3
В данном случае пробел недопустим, так как Вас в школе должны были учить, что пробел допустим только между операторами, а вот сами операторы разрывать нельзя, что Вы и сделали.
ну и еще одна реплика с моей стороны.
[QUOTE=KoVadim]... Плюс ко всему, я обращаюсь на [B]Вы[/B], а в ответ имею [b]ты[/b].
[/QUOTE]
в этом топике, мой пост #68
<<Вадим, можно на ты.>>
я полагал, что предложив ты, я расчитывал на обоюдность.ну если тебе хочется Вы, то пожалуйста.
И я полагаю, что Вы на с++ непишите. в противном случае, если вы всетаки на нем пишите, то тем хуже для вас, и еще хуже для тех на кого вы работаете.
можете спорить дальше, но не со мной, а со Стандартом.
[B]Ull9[/B]
[QUOTE]Вадим, можно на ты[/QUOTE]
Не видел.
На С++ не пишу, но нелюблю, когда люди доказывают свою правоту, ссылаясь только на стандарт. Человек должен мыслить, иначе он просто никто.
именно потому что я мыслю, получилось так.
прочел стандарт, несогласился, подумал, изменил свое мнение и согласился.
я действительно считаю, что стандарт очень продуман, и конкретно это сделано умно.
а чтоб доказать свою правоту, надо именно, ссылатся на стандарт. мы спорим о СТАНДАРТИЗИРОВАННОМ продукте (с++), и спор может разрешить только ссылка на стандарт.
таких случаев, "нелогичности" у с++, десятки, их надо просто знать.
именно поэтому с++, считается трудным. но взамен разработчик получает гораздо большую мошь
чем скажем игры в песочнице (java, delphi etc.)