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

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

|
Цитата(Oldring @ May 11 2007, 22:59)  Почему 14? IMHO правильное значение может быть 12, 13, но никак не 14.  аналогично! почему 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
--------------------
|
|
|
|
|
May 14 2007, 00:04
|

Знающий
   
Группа: Свой
Сообщений: 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
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
May 14 2007, 00:07
|
Участник

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

|
А то, что значение переменной может поменяться в результате прерывания? Или в начале каждой sequence point прерывание запрещать, а потом разрешать?
Сообщение отредактировал vromanov - May 14 2007, 00:11
|
|
|
|
|
May 14 2007, 00:19
|

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

|
Цитата(vromanov @ May 14 2007, 06:07)  А то, что значение переменной может поменяться в результате прерывания? Или в начале каждой sequence point прерывание запрещать, а потом разрешать? не-е, ну... предполагается, что переменная i -- это обычная переменная, не volatile. Определена внутри какой-нибудь функции, т.е. размещается либо на стеке, либо в регистрах МП. Иначе говоря, никто из вне ее торкнуть не может.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
May 14 2007, 00:22
|
Участник

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

|
Цитата(zhevak @ May 14 2007, 04:19)  не-е, ну... предполагается, что переменная i -- это обычная переменная, не volatile. Про исходный пример все ясно. Так просто нельзя писать, т.к. результат по стандарту не определен. Мы уже про другое.
|
|
|
|
|
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.
--------------------
Пишите в личку.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|