80

Тут говорят!
Авторизация
Список форумов
Войти через акаунт
 

Старая добрая загадка для программиста :)
Подписаться/отписаться на тему (функция доступна только для зарегистрированных пользователей) Любимая тема (вкл/выкл) []

Страницы: 1  2 
Добавление сообщений к этой теме для незарегистрированных пользователей невозможно
Тему смотрит 1 незарегистрированный пользователь
Модераторы
Рейтинг темы:   (3064 просмотрa)
Вы не можете создавать новые темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
 

Sinner Sinner в оффлайне

писатель
Сообщений: 1 251

Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный

Ogonek (16.12.06 18:00) писал(a):
не могу найти подъёб (

почувствуй себя мего-компилятором-оптимизатором
чтобы ты сделал увидев такую конструкцию?
Код:
bool b = true;
...
while(b) {...}
P.S. кстати, задачу бесполезно тестить под отладчиком

--------------------
Can You Handle Life?
 

Ogonek Ogonek в оффлайне

графоман
Сообщений: 2 602

Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный

Sinner (16.12.06 18:21) писал(a):
почувствуй себя мего-компилятором-оптимизатором чтобы ты сделал увидев такую конструкцию?
Код:
bool b = true;while(b) {...}

bool b = true; // ну присвоил бы b = тру )while(b) {...} // пока тру ... тра та та... ты хочешь сказать что твой код и вот такойwhile(true)не идентичные ? (ну если в цикле не менять значения b!!) они ж одинаковые..

--------------------
любая диктатура в конечном итоге кончается рано или поздно катастрофой для страны и для народа
 

Ogonek Ogonek в оффлайне

графоман
Сообщений: 2 602

Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный

отлчичаются тока тем что в твоём случае при выполнении комп будет делать лишюю операцию сравнения ...

--------------------
любая диктатура в конечном итоге кончается рано или поздно катастрофой для страны и для народа
 

Govage Govage в оффлайне

графоман
Сообщений: 3 934

Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный

Sinner (16.12.06 09:15) писал(a):
когда дойдет до 2^32, т.е. -, тогда и выйдет из цикла

Нет. Выйдет из цикла, когда установится старший бит i.

--------------------
Менск, Беларусь.
 

Ogonek Ogonek в оффлайне

графоман
Сообщений: 2 602

Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный

а старший бит отвечает за знак числа !) так и получится как я в своём примере описал - Вышли с цикла, i=-2147483648

--------------------
любая диктатура в конечном итоге кончается рано или поздно катастрофой для страны и для народа
 

Sinner Sinner в оффлайне

писатель
Сообщений: 1 251

Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный

Govage (16.12.06 18:48) писал(a):
Нет. Выйдет из цикла, когда установится старший бит i.

Да. Это равносильно

--------------------
Can You Handle Life?
 
 

Sinner Sinner в оффлайне

писатель
Сообщений: 1 251

Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный

Ogonek (16.12.06 18:34) писал(a):

bool b = true;
...
while(b) {...} // b не меняется
...
while(true)
...
они ж одинаковые..

в том-то и проблема что может генерироваться одинаковый код. Но не всегда. А вот когда такое бывает - это не всегда желательно.

--------------------
Can You Handle Life?
 

Ogonek Ogonek в оффлайне

графоман
Сообщений: 2 602

Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный

Sinner (16.12.06 21:53) писал(a):
в том-то и проблема что может генерироваться одинаковый код. Но не всегда. А вот когда такое бывает - это не всегда желательно.

одинаковый код поидее должен генерится если b у нас константа ... хотя булевские константы это смех какойто

а так ну никак ни может генерится одинаковый код, т.к. если аргемент у while - переменная то компилятор должен сделать код, который будет каждый раз при повторении цикла проверять изменилась ли она

--------------------
любая диктатура в конечном итоге кончается рано или поздно катастрофой для страны и для народа
 

Govage Govage в оффлайне

графоман
Сообщений: 3 934

Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный

Sinner (16.12.06 21:45) писал(a):
Да. Это равносильно

Не равносильно. Тип int имеет ширину 32 разряда. Следовательно, старший бит - 31, а значит прога выйдет из цикла, когда i==2^31.

--------------------
Менск, Беларусь.
 

Govage Govage в оффлайне

графоман
Сообщений: 3 934

Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный Govage популярный

Ogonek (16.12.06 22:03) писал(a):
а так ну никак ни может генерится одинаковый код, т.к. если аргемент у while - переменная то компилятор должен сделать код, который будет каждый раз при повторении цикла проверять изменилась ли она

Компилятор вполне может сгенерить код, где эта переменная занесена в регистр, который в текущем потоке не изменяется. Чтобы такого не было, надо добавлять модификатор volatile.

--------------------
Менск, Беларусь.
 

Sinner Sinner в оффлайне

писатель
Сообщений: 1 251

Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный

Govage (16.12.06 22:15) писал(a):
Не равносильно. Тип int имеет ширину 32 разряда. Следовательно, старший бит - 31, а значит прога выйдет из цикла, когда i==2^31.

да, да2^31 прошу прощения, ошибся. чето заклинило с 32

--------------------
Can You Handle Life?
 

Sinner Sinner в оффлайне

писатель
Сообщений: 1 251

Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный Sinner популярный

Ogonek (16.12.06 22:03) писал(a):
одинаковый код поидее должен генерится если b у нас константа ... хотя булевские константы это смех какойто

а так ну никак ни может генерится одинаковый код, т.к. если аргемент у while - переменная то компилятор должен сделать код, который будет каждый раз при повторении цикла проверять изменилась ли она

может, например вот так(для обоих случаев):
Код:
while(b == true) ~ while(true) ~ if(b ==true) { for(;;;) { ... } }
т.о. проверка одна, что ускоряет работу. А в это время другой поток изменяет b, но цикл не прерывается. Т.о. ставить volatile, чтобы дать компилятору понять, что обращение к b должно быть всегда, что b может измениться. К тому же при компиляции под релизом значение b перед циклом может быть записано в регистр, и сравниваться значение будет с тем, что в регистре, а не в памяти, как уже отметил Govage

--------------------
Can You Handle Life?
 
 

Андрей Коростелев Андрей Коростелев в оффлайне

постоялец
Сообщений: 110

Андрей Коростелев на старте

Мунька (15.12.06 23:54) писал(a):
Ладно, господа. Тогда еще одна задачка.
Если ли выход из цикла?
int i=1;
while(i>0)
i++;

В общем случае мы будем иметь неопределенное поведение при попытке инкремента i равному INT_MAX.
ANSI ISO 5/5 [expr]
If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable
values for its type, the behavior is undefined, unless such an expression is a constant expression
(5.19), in which case the program is illformed.
Однако реазизация многих компиляторов при этом сгенерируют вполне логичное значение -(2^(N-1) ), где N - число битов в int. Которое на 32-битных платформах будет равно -2147483648, что прервет цикл.

--------------------
-- Андрей
 

Мунька Мунька в оффлайне

графоман
Сообщений: 31 482

Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть Мунька имеет репутацию, которую нельзя пошатнуть

Андрей Коростелев (17.12.06 12:52) писал(a):
В общем случае мы будем иметь неопределенное поведение при попытке инкремента i равному INT_MAX.
ANSI ISO 5/5 [expr]If during the evaluation of an expression, the result is not mathematically defined or not in the range of representablevalues for its type, the behavior is undefined, unless such an expression is a constant expression(5.19), in which case the program is illformed.
Однако реазизация многих компиляторов при этом сгенерируют вполне логичное значение -(2^(N-2) ), где N - число битов в int. Которое на 32-битных платформах будет равно -2147483648, что прервет цикл.

В общем случае, может быть. А в реальных компиляторах да, цикл прервется. Там же int объявлено, а не unsigned int

--------------------
Самыми опасные дураки - это дураки с высоким интеллектом; они думают, что они самые умные.
 

Андрей Коростелев Андрей Коростелев в оффлайне

постоялец
Сообщений: 110

Андрей Коростелев на старте

Мунька (17.12.06 23:55) писал(a):
В общем случае, может быть. А в реальных компиляторах да, цикл прервется.

На каком основании сделано данное утверждение?В С++ различают три вида поведения, отклоняющегося от стандартного:1. Implementation-defined behavior - поведение программы при определенных условиях носит четко определенный характер, описанный в документации компилятора.2. Unspecified behavior - то же что и implementation-defined, однако поведение может быть не задокументировано.3. Undefined behavior - стандарт не предъявляет никаких требований к реализациям компилятора по поводу поведения программы в данных условиях.Как видишь, о какой-то определенности поведения выражения int i = INT_MAX+1; можно было бы говорить развe что в первых двух случаях, да и то применительно к конкретной версии конкретного компилятора.

--------------------
-- Андрей
 

Андрей Коростелев Андрей Коростелев в оффлайне

постоялец
Сообщений: 110

Андрей Коростелев на старте

Мунька (17.12.06 23:55) писал(a):
Там же int объявлено, а не unsigned int

В случае с unsigned int мы имели бы вполне определенное поведение, потому как арифметика беззнаковых чисел рассмаривается по модулю 2^N. В отличие от знаковых, где переполнение ведет к неопределененному поведению.

--------------------
-- Андрей
 

Злой Бог Злой Бог в оффлайне

писатель
Сообщений: 2 264

Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный

>int i=1;i= i++ + ++i;Язык, который такое допускает, должен умереть.

--------------------
Правда придёт.
 

Ogonek Ogonek в оффлайне

графоман
Сообщений: 2 602

Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный Ogonek популярный

deus666 (20.12.06 03:41) писал(a):
Язык, который такое допускает, должен умереть.

объясни почему ?

--------------------
любая диктатура в конечном итоге кончается рано или поздно катастрофой для страны и для народа
 

Злой Бог Злой Бог в оффлайне

писатель
Сообщений: 2 264

Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный Злой Бог популярный

Потому что потом такое кому-то отлаживать/переписывать приходится.

--------------------
Правда придёт.
 

Ынг - профиль удален пользователем

Guest

deus666 (20.12.06 12:37) писал(a):
Потому что потом такое кому-то отлаживать/переписывать приходится.

Это не язык виноват, а гении, которые такое пишут. Хорошо написанная программа легко читается и отлаживается вне зависимости от языка, на котором она написана.
 

Kernel Kernel в оффлайне

писатель
Сообщений: 2 131

Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный Kernel популярный

[в_ответ_на]вот вам вполне жизненная задачка volatile

--------------------
This message was sent with 100% recyclable electrons...
Страницы: 1  2 
 
Быстрый переход
[]
Вверх
HOSTER.BY: профессиональный хостинг и регистрация доменов .BY
Более 35000 сайтов выбрали нас. Присоединяйтесь!
 
РЕСУРСЫ ПОРТАЛА
   Все ресурсы