6°C
завтра: 3°C
Погода в Перми
6°C
ночью0°C
утром−1°C
завтра3°C
Подробно
 64,68
+0.6996
Курс USD ЦБ РФна 26 апреля
64,6794
+0.6996
 72,11
+0.3961
Курс EUR ЦБ РФна 26 апреля
72,1111
+0.3961
  • member

    Сообщений: 30

    Я не понимаю, почему сабж на С может выдает 14?
    Кто-нибудь может мне объяснить, так сказать для чайника?

  • veteran

    Сообщений: 1769

    И еще бывает хуже:
    i = (++i)*2 + ++i = 21
    i = (++i)*3 + ++i = 25
    Из-за такой неоднозначности лучше не пользовать ++i,
    а либо (i + 1), либо i++.

  • veteran

    Сообщений: 1769

    Можно понять так:
    ++i приводит к i = 5+1 = 6
    потом еще раз
    ++i приводит к i = 6+1 = 7
    И только потом заменяет СИ ++i на полученное:
    i = ++i + ++i = 7 + 7 = 14
    но мой пример это правило не объясняет :безум:

  • ЙА ТИГОР

    Сообщений: 8120

    Ну, правильно понимаете. Примерами на порядок действий в операциях с такими инкрементами-декрементами как раз "чайников" и любят баловать в задачниках по усвоению арифметических действий.

    И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.

    И вы уверены, что во втором посту у вас в обоих выражениях верные значения?

    Кто яростно ненавидит мотоциклистов тот сам латентный мотоциклист.

  • activist

    Сообщений: 109

    В ответ на: И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
    Более того, могут быть как эти значения, так и какие-то другие. Это зависит от порядка операций в скомпилированном коде. Поэтому, собственно, авторы учебников настоятельно не рекомендуют использовать подобные выражения. А хороший компилятор, по идее, должен их обнаруживать и выдавать предупреждения.

  • veteran

    Сообщений: 1769

    В ответ на: И вы уверены, что во втором посту у вас в обоих выражениях верные значения?
    Хек...
    Ясен пень - уверен, т.к. такие утверждения всегда
    проверяю кодом (здесь использовал Visual C++ 6.0)

  • veteran

    Сообщений: 1769

    В ответ на: И если вы в этих выражениях попользуете и++, то еще больше удивитесь тому, чему будет равно значение выражения и чему будет равно само и после выполнения всех действий.
    Не... Грамматику СИ знаем-с :umnik:
    Совсем не удивлюсь, т.к. по правилам СИ для выражения
    i++ сначало в операторе будет использовано выражение
    для i, а только после завершения оператора величина i
    будет увеличена на единицу :спок:

    Исправлено пользователем fredd (24.10.10 01:30)

  • guru

    Сообщений: 9338

    В ответ на: проверяю кодом (здесь использовал Visual C++ 6.0)
    Похвально, но, как было сказано выше, зависит от компилятора.

  • member

    Сообщений: 30

    Я понимаю что тут возможны получения разных вариантов ответа. Но все же меня интересует ответ именно 14. Почему? КАК???
    Кто-нибудь может поэтапно объяснить?

  • member

    Сообщений: 72

    i=5;
    i = ++i /*==6*/ ++ /*6++ == 7*/ + i /* 7 + 7 == 14*/

  • activist

    Сообщений: 109

    Не поленился, проверил. Использовал MSVS 2008. Таки да, на C++ дает результат 14. Что интересно, C# дает результат 13. Мое предположение, что C++ генерирует примерно следующий код на асме:
    inc i // Первое ++i
    inc i // Второе ++i
    mov eax, i // Сумма первого и второго
    add eax, i
    mov i, eax

  • guru

    Сообщений: 9338

    В ответ на: меня интересует ответ именно 14. Почему? КАК???
    fredd уже ведь объяснил во втором его сообщении в ветке. Вы ответы читаете?

  • v.i.p.

    Сообщений: 13142

    абсолютно верно. Если мне память не изменяет, то в правилах компилятора С сказано, что операнды выражений СНАЧАЛА разименовываются, а только потом подставляются. И еще: приоритет ++ операций - выше остальных, кроме скобок.

    Так что ответ 14 - верен.:улыб:

    "Только так, только личная инициатива и напряженная работа над собой. Вот я вас хочу именно к этому призвать .. Нужно своей собственной рукой все делать" (с) В.В. Путин :)

Записей на странице:

Перейти в форум

Модератор: