Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему такой результат??? 
V
    Опции темы
nerezus
Дата 10.5.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Цитата

А можно ткнуть меня носом в компилеры, которые тут выдают че-то другое, кроме 14? Самому лень искать
 perl выдал 13


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
turboNOMAD
Дата 11.5.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 1.1.2007

Репутация: нет
Всего: нет



Цитата(nerezus @ 10.5.2007,  23:16)
perl выдал 13

C# тоже, как известно, выдает 13. Я имел в виду сиплюсовые компиляторы ;)
PM MAIL   Вверх
JackYF
Дата 11.5.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



quote=nickless, 10.5.2007,  21:37, post1129056]$ g++ -Wall -o bla bla.cpp
bla.cpp: In function ‘int main()’:
bla.cpp:18: warning: operation on ‘i’ may be undefined
bla.cpp:18: warning: operation on ‘i’ may be undefined[/quote]

Просто замечательно! Я сам не пробовал, но варнинг - это уже хорошо.
По крайней мере, есть предупреждение.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
smartov
Дата 11.5.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



nerezus, у меня перл выдал 14. Perl 5.8.8 Linux 

Проверил на других языках
PHP, Javascript, (и как сказали C#) - 13
PM MAIL   Вверх
Ignat
Дата 11.5.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 3
Всего: 73



Господа, я не претендую на хорошее знание сей, но ткните меня носом в UB.
UB у нас будет в случае использования постфиксного инкремента, когда переменная для последующих операций берется по значению.
В случае же префиксного инкремента результат операции инкремента всегда будет возвращен по ссылке. Приоритет инкремента всегда выше сложения (не путайте с унарной операцией +). Следовательно результат данного выражения в C/C++ гарантирован.

Пожалуйста, поправьте, мне самому стало интересно smile


--------------------
Теперь при чем :P
PM   Вверх
Любитель
Дата 11.5.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Ignat, по-моему именно эту ссылочку уже приводили, но всё же:

http://www.research.att.com/~bs/bs_faq2.html#undefined - из хоум пйдж Бьярни Строуструпа.

Добавлено через 4 минуты и 55 секунд
Цитата(Bjarne Stroustrup)

int i = 10;
int j = ++i + i++;

<...>

the order of evaluation of arguments is unspecified



--------------------
PM MAIL ICQ Skype   Вверх
_stranger_
Дата 11.5.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 3.10.2006
Где: город-герой Киев

Репутация: 2
Всего: 2



и еще дополнение к вышесказанному:
ISO/IEC 14882 C++
5. Expressions. Clause 4
Цитата

Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. ... otherwise the behavior is undefined

перевод на русский: между последовательными точками исполнения скалярный объект может меняться не более одного раза в результате вычисления выражения. ... Иначе результат не определен (UB).



PM MAIL   Вверх
Hurricane
Дата 11.5.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(Ignat @ 11.5.2007,  10:31)
В случае же префиксного инкремента результат операции инкремента всегда будет возвращен по ссылке.

Это можно как-то гарантировать?  smile Имеется ввиду не только для int, но и возможную кривую реализацию перегруженного оператора класса. Да и для int, похоже, что одни компиляторы использую ссылку (результат 14), другие - копию (результат 13).


Это сообщение отредактировал(а) Hurricane - 11.5.2007, 19:29
PM MAIL   Вверх
Promitheus
Дата 11.5.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



Код

int i=5;
i=++i + ++i + ++i;//выдает 24


Может быть они в С++ всё так и задумали.

Идём слева направо встречаем ++i, меняем содержимое на +1 , далее встречаем +, смотрим , что далее ++i у него больше приоритет, выполняем его, далее встречаем +, но за ним ++i - выполняем. А потом уже выполняем сложение, но в качестве аргументов не значение числовое, а значание которое находится по адресу в памяти у переменной i. Т.е. при выполнении операций он запоминает не числовое значение, а указатель на область памяти, а потом выполняет с этими указателями операции более низкого приоритета. 

Это то, как мне видется такое поведение компилятора. Впринципе, нечего необычного в поведении нету. Это чисто мои догадки, как на самом деле реализовано, я естественно не знаю.

На асме бы всё это надо написать.... мож понятнее будет. 

PM MAIL ICQ   Вверх
nickless
Дата 11.5.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Я не понимаю, ну зачем зря гадать что получится, написано UB, значит UB.
Конечно в каждом компиляторе это как-то реализовано, и в польшинстве случаев он выдаст один и тот же результат, но это абсолютно не гарантирует, что результат не будет другим со включеной оптимизацией, после изменения кода в другом файле проекта, с новой версией компилятора или после внезапного лунного затмения. Нравится плясать с бубном?


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
zkv
Дата 11.5.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Promitheus @  11.5.2007,  19:38 Найти цитируемый пост)
int i=5;
i=++i + ++i + ++i;//выдает 24

я пошел еще дальше, и установил следующие факты:
Код

int i=5;
i=++i + ++i + ++i + ++i;//выдает 36

Код

int i=5;
i=++i + ++i + ++i + ++i + ++i;//выдает 48

Мне кажется, что компилятор интерпретирует выражение "+ ++i"  как "прибавить 12"
Завтра попробую продолжить эксперименты.

PS Шутка smile
PPS Наврал, в последнем не 48 получается, придется искать другое объяснение...

Это сообщение отредактировал(а) zkv - 11.5.2007, 19:56
PM MAIL   Вверх
Любитель
Дата 11.5.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Promitheus @  11.5.2007,  19:38 Найти цитируемый пост)
//выдает 24

Да ну. Ты уверен?

На вскидку - после компайла MinGW и запуска, получаем 22 smile

Андефинед бехаувер и всё! Хватит собственные варианты придумывать! Есть стандарт, который чётко определяет, что мы должны и когда получить. И он определяет, что в данной ситуации мы можем получить, что угодно.

Всё!


--------------------
PM MAIL ICQ Skype   Вверх
Hurricane
Дата 11.5.2007, 19:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 10.4.2007

Репутация: 6
Всего: 9



Цитата(Любитель @ 11.5.2007,  11:52)
Андефинед бехаувер

 smile 

Ай лайк йор джёрмен аксент!  smile 
PM MAIL   Вверх
Promitheus
Дата 11.5.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 28.3.2007

Репутация: 1
Всего: 1



Любитель

Код

int i=5;
i=++i + ++i + ++i;
ShowMessage(i);

В 6 Билдере прям в конструктор формы затолкай и откомпили, посмотришь, что получится - 24. 
__

Ну вообще да это какое-то шаманство ...  i=++i + ++i + ++i + ++i + ++i; полтос выдаёт  smile 
PM MAIL ICQ   Вверх
Любитель
Дата 11.5.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Млин, уже обсудили. В билдере - 24, в MinGW - 22. Где-нибудь 23. Теоритечески может получится, скажем 115. Это будет формально удовлетворять стандарту, ибо по стандарту неизвестно, что должно получиться.

 smile 
Цитата(Hurricane @  11.5.2007,  19:58 Найти цитируемый пост)
Ай лайк йор джёрмен аксент!

А как правильно произносить? А то интересно стало smile

А так - ракладки лень переключать smile


--------------------
PM MAIL ICQ Skype   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1101 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.