реклама на сайте
подробности

 
 
> фича компиляторв, инкремент переменной
zhevak
сообщение May 11 2007, 11:25
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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 -- у него результат зависит от того, включена-ли оптимизация или нет... 07.gif

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

Вечером дома, попробую еще в CodeVision эту фичу покрутить.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vromanov
сообщение May 11 2007, 11:29
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 70
Регистрация: 27-03-07
Пользователь №: 26 533



Тут все просто. По стандарту результат исполнения такого кода не определен. Тот, кто пишет такой код - сам себе злобный буратино.
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 11 2007, 15:37
Сообщение #3


Гуру
******

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



Цитата(vromanov @ May 11 2007, 15:29) *
Тут все просто. По стандарту результат исполнения такого кода не определен. Тот, кто пишет такой код - сам себе злобный буратино.



Угу

Цитата
Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.70)


Цитата
If a ‘‘shall’’ or ‘‘shall not’’ requirement that appears outside of a constraint is violated, the
behavior is undefined.


Цитата
1 undefined behavior
behavior, upon use of a nonportable or erroneous program construct or of erroneous data,
for which this International Standard imposes no requirements
2 NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable
results, to behaving during translation or program execution in a documented manner characteristic of the
environment (with or without the issuance of a diagnostic message), to terminating a translation or
execution (with the issuance of a diagnostic message).


В выражении ++i + ++i значение i изменяется два раза, следовательно, по стандарту результат неопределенный.

В выражении ++i + i значение i считывается два раза, один раз для вычисления нового сохраняемого значения i слева, второй раз - при вычислении правой части сложения, следовательно, по стандарту результат неопределенный.

Обратите внимание, что ключевой момент для применения правила об одном считывании - значение переменной i модифицируется в выражении.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 11 2007, 17:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 11 2007, 18:37) *
В выражении ++i + i ....

Таки да! Имеет место быть неопределенность исполнения side effect от оператора ++ по отношению к операции сложения. Взгляд замылил префиксный инкремент sad.gif, который на самом деле не имеет отношения к делу.
Если вернуться к первоисточнику, то в этом конкретном случае ничего принципиально не разрешимого для компилятора нет, однако смягчения правил игры установленные стандартом в виде виде sequence point позволяют ему не разбираться с этими заморочками. Совершенно правильный подход к делу, поскольку заумные выражения усложняет жизнь компилятору и на самом деле ничего не дают програмисту.
С другой стороны никто не может запретить разбирать и более сложные конструкции в этом случае он (Watcom, например) спокойно жует и такие перлы и выдает правильное значение 14. Те компиляторы, которые не разбирают - ругаются (IAR). Те компиляторы, которые не разбирают, молчат и выдают произвольное значение - бяки smile.gif.

Цитата(vromanov @ May 11 2007, 19:08) *
Удивительно, что столь очевидная вещь собрала столько сломанных копий.

Где Вы копья увидели? А вещь не очевидная, если считать очевидным не использование такой дури в явном виде ни при каких условиях smile.gif.

Сообщение отредактировал zltigo - May 11 2007, 18:52


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
vromanov
сообщение May 11 2007, 18:54
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 70
Регистрация: 27-03-07
Пользователь №: 26 533



Цитата(zltigo @ May 11 2007, 21:48) *
Где Вы копья увидели? А вещь не очевидная, если считать очевидным не использование такой дури в явном виде ни при каких условиях smile.gif.

По всем сообществам разбирают эту строчку. И куча народа дже после правильного ответа продолжают что-то придумывать, строить какие-то предположения..
Еще и колеги на работе по аське достали этим выражением.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 11 2007, 19:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(vromanov @ May 11 2007, 21:54) *
И куча народа дже после правильного ответа продолжают что-то придумывать, строить какие-то предположения..

Никаких придумок - либо компилятор должен выдать 14, либо ссылаясь на биль о правах компиляторов отказаться отвечать на этот вопрос допущения стандарта послать такое выражения подальше.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 11 2007, 19:59
Сообщение #7


Гуру
******

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



Цитата(zltigo @ May 11 2007, 23:03) *
Никаких придумок - либо компилятор должен выдать 14, либо ссылаясь на биль о правах компиляторов отказаться отвечать на этот вопрос допущения стандарта послать такое выражения подальше.


Почему 14?
IMHO правильное значение может быть 12, 13, но никак не 14. biggrin.gif


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
PrSt
сообщение May 13 2007, 14:08
Сообщение #8


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(Oldring @ May 11 2007, 22:59) *
Почему 14?
IMHO правильное значение может быть 12, 13, но никак не 14. biggrin.gif

аналогично!
почему 14 ???
13 и баста...
вариант с 12 - доспустим,но это добжен быть невероятно глупый компилятор, причем с патароченными критериями и правилами оптимизации...

но а 14 откуда берется?
и почему у gcc тоже 14???

я прошу, нет, ... требую... объясните плз...

я конечно не виликий гуру - но тут то заблудиться трудно!
13 и ничего иного...
x = ++i+ ++i

разбиваем как это делает компилятор
temp1 = ++i (стало 6)
temp2 = ++i (стало 7)
x=temp1+temp2 (стало 13)

от куда 14???

...и вообще! что это у людей за безгранично глупая привычка все писать без скобок !?
что за мода надеяться на безграничный интелект компилятора?
...истинну глаголю - индусы писали это эйфелеву конструкцию!
не иначе ...или [CENSORED]!

а глупость то видать явно в компиляторах и это напоминает подвох с x=2+2*2, чему равен x?

.

Сообщение отредактировал PrSt - May 13 2007, 16:54


--------------------
Go to the top of the page
 
+Quote Post
zhevak
сообщение May 14 2007, 00:04
Сообщение #9


Знающий
****

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



Цитата
...
разбиваем как это делает компилятор
temp1 = ++i (стало 6)
temp2 = ++i (стало 7)
x=temp1+temp2 (стало 13)

от куда 14???
...


1. Да простит меня великий All, что я поднял эту волну... Просто мною овладело любопытство.

2. Я про явное отличие компиляторов С/С++ и С# скажу. Точнее скажу свои доводы, как эти компиляторы понимают код
x = ++i + ++i;

Компиляторы С/С++ складывают (последняя операция -- сложение) переменную i c переменной i, в то время как C# складывае результат выражения ++i с результатом выражения ++i.

Таким образом, для С/С++ на момент сложения переменных, они будут равны 7 (даром, что это одна и та же переменная!), результат получаем -- 14. C# складывает результаты выражений: первый результат на момент сложения равен 6, второй -- 7, что в итоге дает 13.

Отсюда вопрос -- что должны складывать компиляторы: результаты выражений или значения переменных?

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

И еще, наверно стоит зайти на РСДН, посмотреть что там говорят гуру. (Сылку я приводил в первом посте.)

Сообщение отредактировал zhevak - May 14 2007, 00:13


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zhevak   фича компиляторв   May 11 2007, 11:25
||- - lebiga   Пора рассматривать известную шутку Ричи и Керниган...   May 13 2007, 16:03
||- - 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
- - singlskv   Я Вам не помешаю ? Выскажу свое ИМХО: - Компилято...   May 12 2007, 22:53
|- - zltigo   Цитата(singlskv @ May 13 2007, 01:53) - р...   May 13 2007, 06:48
|- - cebotor   Цитата(singlskv @ May 13 2007, 02:53) Я В...   May 15 2007, 06:19
|- - Oldring   Цитата(cebotor @ May 15 2007, 10:19) все ...   May 15 2007, 06:26
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.14179 секунд с 7
ELECTRONIX ©2004-2016