Важная информация
Показано с 1 по 7 из 7

Тема: Вопрос по синтаксису

  1. #1 Вопрос по синтаксису 
    Новичок
    Регистрация
    30.05.2018
    Сообщений
    2
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    Всем доброго времени суток! Никак не могу разобраться с одним моментом, насколько я понимаю выражение к примеру i = i+1 и i++ это одно и тоже. Т.е. переменная прибавляет к самой себе единицу.

    C++ Code:
    1. void cent_iback(int *&arr, int &size, int value)
    2. {
    3. int *new_array2 = new int[size = size + 1];
    4. for (int i = 0; i < size; i++)
    5. {
    6. if (i < 2) new_array2[i] = arr[i];
    7. else if (i == 2) new_array2[2] = value;
    8. else new_array2[i] = arr[(i - 1)];
    9. }
    10. delete[] arr;
    11. arr = new_array2;
    12. }


    Все работает отлично, но если написать вместо size = size + 1 выделенного красным цветом size++, то вылезает ошибка. Помогите пожалуйста разобраться. Заранее спасибо!
    Функция копирует уже существующий динамический одномерный массив с подстановкой данных в трейтий элемент массива и сдвигом остальных значений в право.
    Последний раз редактировалось rrrFer; 31.05.2018 в 08:34.
    Ответить с цитированием  
     

  2. #2  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    561
    Сказал(а) спасибо
    34
    Поблагодарили 249 раз(а) в 164 сообщениях
    Говнокод.
    выражение к примеру i = i+1 и i++ это одно и тоже.
    оператор i++ принимает объект i, создает его КОПИЮ (обозначим k), увеличивает значение i, но возвращает значение k.

    Т.е. он возвращает копию, которая является ВРЕМЕННЫМ объектом.

    i = i+1 работает не так

    Приоритет оператора + выше чем =. Поэтому сначала выполняется +.
    Оператор + вообще не изменяет значение i, он тоже создает копию и увеличивает значение этой копии (заметь, что i++ значение временного объекта не увеличивает). Эту копию и возвращает оператор +.
    Оператор = принимает значение (в данном случае временный объект) и заменяет значение переменной слева тем, что находится справа. Возвращает этот оператор НЕ КОПИЮ, а именно переменную i, т.е. это не временный объект.

    Это, вобщем-то, ТО, что должен понимать каждый, кто пишет на С++.

    Почему вылезает ошибка - не знаю, и какая ошибка - тоже. Но мораль в том, что писать так не стоит. Не исключено, что в коде есть вообще ФАТАЛЬНАЯ ошибка (я не уверен), но, посмотрите на [Ссылки могут видеть только зарегистрированные пользователи. ]:
    * У оператора new[] приоритет ниже чем у постфиксного ++ (который вы пытались использовать);
    * у new[] приоритет такой же как у инфиксного ++ (поэтому замена на ++i может привести к чему-то не понятному и возможно результат будет зависеть от компилятора)
    * приоритет оператора присваивания НИЖЕ чем у new[], поэтому как там будет работать ваш код - надо разбираться с кучей литературы.

    И все это из-за чего? из-за того, что пытаемся сэкономить одну строку? Лень объявить переменную? Хотим написать как-то хитрожопо и удивить коллег?
    Очень советую почитать литературу по чистому коду, например вот "[Ссылки могут видеть только зарегистрированные пользователи. ]". Общий посыл в том, что:
    ороший код должен обладать следующими характеристиками:
    не должен мешать программисту вносить изменения;
    должен легко тестироваться;
    должны использоваться, по возможности, стандартные решения.
    Ну т.е. ваш код этим принципам не соответствует.

    Цитата Сообщение от Дмитрий Овчаренко Посмотреть сообщение
    Функция копирует уже существующий динамический одномерный массив с подстановкой данных в трейтий элемент массива и сдвигом остальных значений в право.
    Делает ваша функция это через задницу, а помимо прочего зачем то выполняет кучу всего что никак с задачей не связано - выделяет память, освобождает память из под старого массива...
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    Ответить с цитированием  
     

  3. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (31.05.2018), Free Admin (31.05.2018), Дмитрий Овчаренко (01.06.2018)

  4. #3  
    Новичок
    Регистрация
    30.05.2018
    Сообщений
    2
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    Большое спасибо за информацию! Только начал изучать программирование в принципе и назвать меня программистом - нельзя еще наверное лет пять как минимум. Интересовала именно работа операторов i++ и i = i +1. Искал по этому поводу информацию - но не нашел. Ваш ответ дал разъяснение. Все вроде понятно. А по части функции там, много лишнего - изучал отдельные моменты работы компилятора. За доп. литературу отдельное спасибо!
    Последний раз редактировалось Дмитрий Овчаренко; 01.06.2018 в 01:53.
    Ответить с цитированием  
     

  5. #4  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1
    Интересовала именно работа операторов i++ и i = i +1
    Тут важен контекст, где вы это пишете.
    Если просто код программы, не в каких-либо конструкциях как у вас, то инкремент(i++) это просто одна инструкция
    а i = i + 1 - это вычисляемое выражение(одна ячейка копируется в другую), для правой части которого выделяется
    промежуточная память(или регистр) всё это схлопывается в набор команд, при оптимизации даёт ту же одну инструкцию.
    В конструкциях надо уже смотреть внимательно, язык что-то может предусматривать, что-то нет.

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

    Цитата Сообщение от Дмитрий Овчаренко Посмотреть сообщение
    Только начал изучать программирование в принципе
    А не жёстко сразу на плюсы?
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  6. Пользователь сказал cпасибо:

    Free Admin (01.06.2018)

  7. #5  
    Admin
    Регистрация
    09.04.2014
    Сообщений
    1,220
    Сказал(а) спасибо
    781
    Поблагодарили 493 раз(а) в 405 сообщениях
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    А не жёстко сразу на плюсы?
    нормально!)
    зато потом Java, C# и т.д. влёт пойдут...)
    Ответить с цитированием  
     

  8. Пользователь сказал cпасибо:

    >Quiet Snow< (02.06.2018)

  9. #6  
    Профи Аватар для rrrFer
    Регистрация
    01.08.2013
    Сообщений
    561
    Сказал(а) спасибо
    34
    Поблагодарили 249 раз(а) в 164 сообщениях
    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    то инкремент(i++) это просто одна инструкция
    а i = i + 1 - это вычисляемое выражение(одна ячейка копируется в другую)
    Нет. (см. мои комментарии выше).

    "Просто инкремент" - это скорее ++i. Есть разница. На самом деле зависит от того, как реализован этот оператор.


    Цитата Сообщение от >Quiet Snow< Посмотреть сообщение
    всё это схлопывается в набор команд, при оптимизации даёт ту же одну инструкцию.
    Опять же, зависит от того, как реализован оператор. Есть некоторые соглашения о кодировании, которые можно долго читать и изучать (я сам этим одно время тщательно занимался). Но лучше прочитать информацию по ссылкам, приведенным выше, где показаны общие принципы. На их основе строятся некоторые другие например "принцип наименьшего удивления". Дак вот чтобы код был более читаемый - оператор i++ должен создавать и возвращать КОПИЮ (а это не просто инкремент), а ++i - инкрементирует и возвращает оригинальный объект.

    Поэтому i++ не может "схлопнуться в одну инструкцию" в общем случае.
    Просто тут значения b и c наверное будут разными:
    C++ Code:
    1. int a1 = 5;
    2. int a2 = 5;
    3. int b = a1++;
    4. int c = ++a2;
    Последний раз редактировалось rrrFer; 04.06.2018 в 16:18.
    [Ссылки могут видеть только зарегистрированные пользователи. ] // программирование на Prolog, Erlang, C++
    Ответить с цитированием  
     

  10. 2 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (05.06.2018), Free Admin (05.06.2018)

  11. #7  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,950
    Сказал(а) спасибо
    1,847
    Поблагодарили 992 раз(а) в 850 сообщениях
    Записей в блоге
    1
    Цитата Сообщение от rrrFer Посмотреть сообщение
    int b = a1++;
    int c = ++a2;
    Спасибо за инфу Володь, я не писал про работу в контексте, эти вещи как раз лучше тебе пояснять.
    У меня была другая цель, объяснить ТС-у разницу простого инкремента переменной от выражения.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  12. Пользователь сказал cпасибо:

    rrrFer (22.06.2018)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Вопрос по TCP/IP
    от Дамир Массалимов в разделе Сети
    Ответов: 1
    Последнее сообщение: 06.01.2018, 00:31
  2. вопрос
    от Robert в разделе Общие вопросы программирования
    Ответов: 4
    Последнее сообщение: 03.01.2017, 01:18
  3. веб вопрос!
    от Onload в разделе Общие вопросы программирования
    Ответов: 2
    Последнее сообщение: 17.02.2014, 03:28
  4. Ответь на вопрос!
    от Илья Широков в разделе Общие вопросы web-разработки
    Ответов: 1
    Последнее сообщение: 26.11.2013, 03:05
  5. Вопрос по матрице
    от alf в разделе QBasic
    Ответов: 7
    Последнее сообщение: 07.12.2010, 12:53
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •