12°C
завтра: 17°C
Погода в Перми
12°C
ночью9°C
утром11°C
завтра17°C
Подробно
 92,13
−0.3744
Курс USD ЦБ РФна 26 апреля
92,1314
−0.3744
 98,71
−0.2039
Курс EUR ЦБ РФна 26 апреля
98,7079
−0.2039
  • Я не понимаю, почему сабж на С может выдает 14?
    Кто-нибудь может мне объяснить, так сказать для чайника?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Модератор: