|
фича компиляторв, инкремент переменной |
|
|
|
May 11 2007, 11:25
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
На форуме программистов (здесь http://www.rsdn.ru/Forum/?mid=2481623) с пацанами сейчас подняли интересную тему. Думаю, что си-шникам тоже следует остерегаться подобного кода. В двух словах проблема состоит в том, как компилятор должен понимать оператор инкремента.
int i; int x;
i = 5; x = ++i + ++i;
Чему в результате будет равно х ? Прикол в том, что MS VC++ 6.0 и VC++.NET дают результат, равный 14. Майкрософтовский C# и IAR говорят, что х = 13. А более всего удивил Watcom -- у него результат зависит от того, включена-ли оптимизация или нет... Я, конечно, понимаю, что код, который обсуждается, несколько далек от жизни, но все же, знать о таких прибабахах -- надо. Вечером дома, попробую еще в CodeVision эту фичу покрутить.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
 |
Ответов
|
May 12 2007, 22:53
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Я Вам не помешаю ?  Выскажу свое ИМХО: - Компилятор который не выдет warning в такой ситуации, вне зависимости от уровня оптимизации, это компилятор который не следует стандарту С. - соглашусь с Oldring, 12 или 13 еще как-то укладывается в то, как учитывая стандарт С, компилятор должен был бы разбирать это выражение - результат 14 для большинства компиляторов говорит только о том, что "очень хотелось соптимизировать" и компилятор "успешно" справился с этой задачей... 2 zligoЕсли Вы имеете в виду такую предсказуемость работы "оптимизаторов" в компиляторах, то с Вами я тоже полностью согласен
|
|
|
|
|
May 15 2007, 06:19
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809

|
Цитата(singlskv @ May 13 2007, 02:53)  Я Вам не помешаю ?  Выскажу свое ИМХО: - Компилятор который не выдет warning в такой ситуации, вне зависимости от уровня оптимизации, это компилятор который не следует стандарту С. - соглашусь с Oldring, 12 или 13 еще как-то укладывается в то, как учитывая стандарт С, компилятор должен был бы разбирать это выражение - результат 14 для большинства компиляторов говорит только о том, что "очень хотелось соптимизировать" и компилятор "успешно" справился с этой задачей... 2 zligoЕсли Вы имеете в виду такую предсказуемость работы "оптимизаторов" в компиляторах, то с Вами я тоже полностью согласен  все операции детерминированы . в выражении ++i + ++i во втором "отделении спектакля" производиться только сложение двух подвыражений - а подвыражения эти - равны текущему значению i (вариант а), либо вычисленному значению подвыражения (вариант б). нигде не написано в стандарте про то какой вариант является правильным - именно поэтому это и называется undefined behavior. неправ тот компилятор который не показал ворнинг - а число при этом можно выдавать где то от 12-ти до 14-ти
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
May 15 2007, 06:26
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(cebotor @ May 15 2007, 10:19)  все операции детерминированы . в выражении ++i + ++i во втором "отделении спектакля" производиться только сложение двух подвыражений - а подвыражения эти - равны текущему значению i (вариант а), либо вычисленному значению подвыражения (вариант б). нигде не написано в стандарте про то какой вариант является правильным - именно поэтому это и называется undefined behavior. неправ тот компилятор который не показал ворнинг - а число при этом можно выдавать где то от 12-ти до 14-ти  Еще раз. Результат всего выражения компилятор имеет право выдать любой - хоть -666, потому что undefined behavior. Но интерпретация значения выражения ++i прописана в стандарте совершенно четко. Результат не является lvalue. Следовательно, это не есть значение переменной i, а именно вычисленное значение подвыражения. В корректных выражениях различие можно обнаружить только если i - volatile.
--------------------
Пишите в личку.
|
|
|
|
Сообщений в этой теме
zhevak фича компиляторв May 11 2007, 11:25 vromanov Тут все просто. По стандарту результат исполнения ... May 11 2007, 11:29 Oldring Цитата(vromanov @ May 11 2007, 15:29) Тут... May 11 2007, 15:37  zltigo Цитата(Oldring @ May 11 2007, 18:37) В вы... May 11 2007, 17:48   vromanov Цитата(zltigo @ May 11 2007, 21:48) Где В... May 11 2007, 18:54    zltigo Цитата(vromanov @ May 11 2007, 21:54) И к... May 11 2007, 19:03     Oldring Цитата(zltigo @ May 11 2007, 23:03) Никак... May 11 2007, 19:59      PrSt Цитата(Oldring @ May 11 2007, 22:59) Поче... May 13 2007, 14:08       lebiga Пора рассматривать известную шутку Ричи и Керниган... May 13 2007, 16:03       zhevak Цитата...
разбиваем как это делает компилятор
temp... May 14 2007, 00:04        Oldring Цитата(zhevak @ May 14 2007, 04:04) Отсюд... May 14 2007, 03:31     vromanov Цитата(zltigo @ May 11 2007, 23:03) Никак... May 11 2007, 20:02      zltigo Цитата(vromanov @ May 11 2007, 23:02) Ком... May 11 2007, 20:19       Oldring Цитата(zltigo @ May 12 2007, 00:19) Нет, ... May 11 2007, 21:07        zltigo Цитата(Oldring @ May 12 2007, 00:07) Это ... May 11 2007, 21:57         Oldring Цитата(zltigo @ May 12 2007, 01:57) Перев... May 12 2007, 07:23          zltigo Цитата(Oldring @ May 12 2007, 10:23) Я-то... May 12 2007, 08:31           Oldring Цитата(zltigo @ May 12 2007, 12:31) Выраж... May 12 2007, 08:45            zltigo Цитата(Oldring @ May 12 2007, 11:45) Ну т... May 12 2007, 09:26             Oldring Цитата(zltigo @ May 12 2007, 13:26) Я при... May 12 2007, 09:34              zltigo Цитата(Oldring @ May 12 2007, 12:34) Не в... May 12 2007, 09:36               Oldring Цитата(zltigo @ May 12 2007, 13:36) Жаль.... May 12 2007, 09:56 Ivan_Kov Проблема стара как "С"...
Скобки использ... May 11 2007, 11:33 zltigo Цитата(Ivan_Kov @ May 11 2007, 14:33) Про... May 11 2007, 18:04 amw GCC 3.4.5
gcc -o x x.c
x = 14
gcc -Os -o x x.c
x =... May 11 2007, 11:33 zltigo Цитата(zhevak @ May 11 2007, 14:25) как к... May 11 2007, 11:57 vromanov не страдайте фигней.
Вот вам выдержка из стандарта... May 11 2007, 12:39 zltigo Цитата(vromanov @ May 11 2007, 15:39) не ... May 11 2007, 12:42 vromanov Как любителю стандартов, вам надо было не искать о... May 11 2007, 12:51 zltigo Цитата(vromanov @ May 11 2007, 15:51) Тут... May 11 2007, 13:13 dxp Цитата(vromanov @ May 11 2007, 19:51) Как... May 11 2007, 13:37  Сергей Борщ Цитата(dxp @ May 11 2007, 16:37) Очевидно... May 11 2007, 14:22   zltigo Цитата(Сергей Борщ @ May 11 2007, 17:22) ... May 11 2007, 14:29 Ivan_Kov Я вот смотрю, и не могу никак понять, что за нужда... May 11 2007, 15:32 vromanov Удивительно, что столь очевидная вещь собрала сто... May 11 2007, 16:08 lebiga Цитата(vromanov @ May 11 2007, 20:08) Уди... May 11 2007, 19:57 defunct Цитатаx = ++i + ++i;
Это в китайских исходниках... May 11 2007, 17:54 vetal По моему все очень просто, т.к. код архитектурно з... May 12 2007, 10:16 Oldring Цитата(vetal @ May 12 2007, 14:16) 3. x=i... May 12 2007, 10:21 vetal ЦитатаТак вот откуда взялась эта третья операция -... May 12 2007, 10:42 Oldring Цитата(vetal @ May 12 2007, 14:42) В дере... May 12 2007, 10:52 zltigo Цитата(vetal @ May 12 2007, 13:42) Это вп... May 12 2007, 11:48 vetal Потому и "undefined bihavior", что по мо... May 12 2007, 11:11 Oldring Цитата(vetal @ May 12 2007, 15:11) Потому... May 12 2007, 12:23  zltigo Цитата(Oldring @ May 12 2007, 15:23) arm-... May 12 2007, 13:05   Oldring Цитата(zltigo @ May 12 2007, 17:05) Молча... May 12 2007, 13:14    zltigo Цитата(Oldring @ May 12 2007, 16:14) В пр... May 12 2007, 14:14     Oldring Цитата(zltigo @ May 12 2007, 18:14) Но пр... May 12 2007, 14:38      zltigo Цитата(Oldring @ May 12 2007, 17:38) В лю... May 12 2007, 14:51       Oldring Цитата(zltigo @ May 12 2007, 18:51) Ну ск... May 12 2007, 15:14        zltigo Цитата(Oldring @ May 12 2007, 18:14) Как ... May 12 2007, 15:42         Oldring Цитата(zltigo @ May 12 2007, 19:42) И при... May 12 2007, 16:06          zltigo Цитата(Oldring @ May 12 2007, 19:06) Стан... May 12 2007, 16:29           Oldring Цитата(zltigo @ May 12 2007, 20:29) Закон... May 12 2007, 16:57            zltigo Цитата(Oldring @ May 12 2007, 19:57) arm-... May 12 2007, 17:55             Oldring Цитата(zltigo @ May 12 2007, 21:55) Меня ... May 13 2007, 08:35              zltigo Цитата(Oldring @ May 13 2007, 11:35) А с ... May 13 2007, 06:24               Oldring Цитата(zltigo @ May 13 2007, 10:24) Посем... May 13 2007, 06:43                zltigo Цитата(Oldring @ May 13 2007, 09:43) А во... May 13 2007, 07:24                 Oldring Цитата(zltigo @ May 13 2007, 11:24) Никак... May 13 2007, 08:02                  zltigo Цитата(Oldring @ May 13 2007, 11:02) Один... May 13 2007, 08:11                   Oldring Цитата(zltigo @ May 13 2007, 12:11) Не дв... May 13 2007, 08:19                    zltigo Цитата(Oldring @ May 13 2007, 11:19) Проб... May 13 2007, 09:15                     Oldring Цитата(zltigo @ May 13 2007, 13:15) Может... May 13 2007, 09:27                      zltigo Цитата(Oldring @ May 13 2007, 12:27) Не с... May 13 2007, 09:38                       Oldring Цитата(zltigo @ May 13 2007, 13:38) Может... May 13 2007, 09:55                        zltigo Цитата(Oldring @ May 13 2007, 12:55) В ст... May 13 2007, 10:12                         Oldring Цитата(zltigo @ May 13 2007, 14:12) Отлич... May 13 2007, 10:26                          zltigo Цитата(Oldring @ May 13 2007, 13:26) Пров... May 13 2007, 10:37                           Oldring Цитата(zltigo @ May 13 2007, 14:37) Aвтор... May 13 2007, 11:03                           vromanov Цитата(zltigo @ May 13 2007, 14:37) Ну ка... May 13 2007, 12:03                            zltigo Цитата(vromanov @ May 13 2007, 15:03) Воо... May 13 2007, 13:15 Niko1a$ Посмотрите полученный ассемблерный код на своей ма... May 12 2007, 12:42 Oldring Цитата(Niko1a$ @ May 12 2007, 16:42)... May 12 2007, 12:46 vetal nios2-elf-gcc выдает без оптимизации 13, с оптимиз... May 12 2007, 13:09 vetal ЦитатаВ обоих случаях оптимизации говорит нельзя?
... May 12 2007, 14:57 zltigo Цитата(singlskv @ May 13 2007, 01:53) - р... May 13 2007, 06:48 scifi Ну вы даёте... Эту бы энергию - да в мирных целях ... May 13 2007, 06:20 vromanov А то, что значение переменной может поменяться в ... May 14 2007, 00:07 zhevak Цитата(vromanov @ May 14 2007, 06:07) А т... May 14 2007, 00:19  vromanov Цитата(zhevak @ May 14 2007, 04:19) не-е,... May 14 2007, 00:22 amw В пост #4 при компилляции добавляем -Wall и получа... May 14 2007, 07:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|