Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57

I++ и ++i (Префиксная и постфиксная форма инкремента)

29.11.2014, 13:48. Показов 6453. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Префиксная и постфиксная форма инкремента.
Когда писал на C++ как-то не задумывался о разнице, а сейчас в примере встретил ++i и решил углубиться в детали, только голова еще больше опухла.
В этом примере
C#
1
2
3
4
5
6
7
8
9
       
            int i = 0;
            int j = 0;
            Console.WriteLine("i = {0}", i);
            Console.WriteLine("j = {0}", j);
            i++;
            ++j;
            Console.WriteLine("i++ = {0}", i);
            Console.WriteLine("++j = {0}", j);
Разницы вообще никакой, однако в цикле одного из примеров использовали именно ++i.
C#
1
2
3
4
5
6
7
8
9
10
            Console.WriteLine("Введите строку: ");
            StringBuilder a = new StringBuilder(Console.ReadLine());
            for (int i = 0; i < a.Length; ) //удаляем из строк все знаки пунктуации
            {
                if (char.IsPunctuation(a[i]))
                {
                    a.Remove(i, 1);
                }
                else ++i;
            }
Тут объясняют, но что-то не очень доходчиво
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2014, 13:48
Ответы с готовыми решениями:

Постфиксная, префиксная форма
Пожалуйста, подскажите int p = 0; int t = p++ - --p; Результат: p=0, t=0 Почему если 0 - (-1) = 1. Переменно p должно быть...

Инкремент префиксная и постфиксная запись
Здравствуйте. Помогите разобраться почему при компиляции ниже представленного кода, в консоли выводится 6. Хоть смейтесь, мне кажется что...

Постфиксная и префиксная форма инкремента и декремента.
Само задание: Написать программу с примерами постфиксной и префиксной формами инкремента и декремента. Число вводится с клавиатуры. ...

15
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.11.2014, 13:56
Лучший ответ Сообщение было отмечено CSharp_user как решение

Решение

Цитата Сообщение от CSharp_user Посмотреть сообщение
Разницы вообще никакой
CSharp_user, в данном примере никакой. Однако попробуйте вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication58 {
    class Program {
        static void Main(string[] args) {
            int n = 0;
            int m = 0;
 
            int i = 0;
            int j = 0;
 
            n = i++;
            m = ++j;
            Console.WriteLine(n);
            Console.WriteLine(m);
            Console.ReadLine();
        }
    }
}
Разница уже есть. Дело в том, что при использовании инкрементированной переменной в к-либо выражении разница проявляется в следующем:
при постфиксной форме сначала текущее значение используется, а потом производится инкремент. А при префиксной текущее значение сначала инкрементируется, а потом уже используется в выражении. Улавливаете смысл?
1
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
29.11.2014, 13:59  [ТС]
И правда, очень наглядно. Спасибо!
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.11.2014, 14:00
CSharp_user, на здоровье)))
0
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
29.11.2014, 14:02  [ТС]
Только не понятно, почему в примере выше они использовали именно ++i...
0
116 / 116 / 70
Регистрация: 10.11.2013
Сообщений: 445
29.11.2014, 15:24
CSharp_user, CSharp_user, https://www.cyberforum.ru/csha... 97094.html

Чекни топик, я там писал об этом...
0
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
29.11.2014, 18:29  [ТС]
Цитата Сообщение от Anderok Посмотреть сообщение
Чекни топик, я там писал об этом...
Для циклов разницы в производительности практически никакой:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Diagnostics;
using System.Text;
 
class Program
{
    static void Main()
    {
        const int m = 100000;
 
        // v++
        Console.WriteLine("Тестирование v++\nЗапускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.");
        Stopwatch s1 = Stopwatch.StartNew();
        for (int i = 0; i < m; i++)
        {
            StringBuilder s = new StringBuilder(1000);
            for (int v = 0; v < 1000; v++)
            {
                s.Append(1); // добавляем целое число (это дольше чем char)
            }
        }
        s1.Stop();
        // ++v
        Console.WriteLine("Тестирование ++v\nЗапускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.");
 
        Stopwatch s2 = Stopwatch.StartNew();
        for (int i = 0; i < m; i++)
        {
            StringBuilder s = new StringBuilder(1000);
            for (int v = 0; v < 1000; ++v)
            {
                s.Append(1); // добавляем целое число (это дольше чем char)
            }
        }
        s2.Stop();
 
 
        Console.WriteLine("v++ = {0} ms", s1.ElapsedMilliseconds);
        Console.WriteLine("++v = {0} ms", s2.ElapsedMilliseconds);
    }
}
Тестирование v++
Запускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.
Тестирование ++v
Запускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.
v++ = 9601 ms
++v = 9611 ms
0
116 / 116 / 70
Регистрация: 10.11.2013
Сообщений: 445
30.11.2014, 00:49
CSharp_user, ты внимательно читал про оптимизацию??
Вот тесты у меня.
Миниатюры
I++ и ++i (Префиксная и постфиксная форма инкремента)  
0
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
30.11.2014, 12:31  [ТС]
Какая-то беда у твоего компилятора.
У меня разница не такая огромная:
Тестирование v++
Запускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.
Тестирование ++v
Запускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.
v++ = 9495 ms
++v = 9443 ms
v++ = 28674316 ticks
++v = 28517293 ticks
Для твоего примера:
v++: 4570
++v: 3537
Но в принципе согласен, в тиках разница посерьезнее

Добавлено через 12 минут
Ахаха.
Поменяй в коде v++ на ++v и обратно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Diagnostics;
using System.Text;
 
class Program
{
    static void Main()
    {
        const int m = 100000;
 
        // v++
        Console.WriteLine("Тестирование ++v\nЗапускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.");
        Stopwatch s1 = Stopwatch.StartNew();
        for (int i = 0; i < m; i++)
        {
            StringBuilder s = new StringBuilder(1000);
            for (int v = 0; v < 1000; ++v)
            {
                s.Append(1); // добавляем целое число (это дольше чем char)
            }
        }
        s1.Stop();
        // ++v
        Console.WriteLine("Тестирование v++\nЗапускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.");
 
        Stopwatch s2 = Stopwatch.StartNew();
        for (int i = 0; i < m; i++)
        {
            StringBuilder s = new StringBuilder(1000);
            for (int v = 0; v < 1000; v++)
            {
                s.Append(1); // добавляем целое число (это дольше чем char)
            }
        }
        s2.Stop();
 
 
        Console.WriteLine("++v = {0} ms", s1.ElapsedMilliseconds);
        Console.WriteLine("v++ = {0} ms", s2.ElapsedMilliseconds);
        Console.WriteLine("++v = {0} ticks", s1.ElapsedTicks);
        Console.WriteLine("v++ = {0} ticks", s2.ElapsedTicks);
        Console.ReadKey();
    }
}
Тестирование v++
Запускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.
Тестирование ++v
Запускаем формирование массива StringBuilder из 1000 элементов, добавляя 1.
++v = 9251 ms
v++ = 9172 ms
++v = 27937383 ticks
v++ = 27697696 ticks
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
30.11.2014, 14:13
CSharp_user,
Вы просто сравните IL код, он идентичен

IL код цикла, и он будет всегда таким, независимо v++ или ++v или v+=1
C#
1
2
3
4
5
6
7
8
9
10
11
IL_0000:  ldc.i4.0    // начальное значение цикла, в даннаом случае 0
IL_0001:  stloc.0     
IL_0002:  br.s        IL_0008
// тут делаем что-то внутри цикла
IL_0004:  ldloc.0     
IL_0005:  ldc.i4.1    // кладем 1 в стек
IL_0006:  add         // инкрементируем
IL_0007:  stloc.0     
IL_0008:  ldloc.0     
IL_0009:  ldc.i4      E8 03 00 00  // Кладем в стек условие выхода из цикла,  в данном случае 1000
IL_000E:  blt.s       IL_0004 // Проверка условия
1
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
30.11.2014, 18:12  [ТС]
Цитата Сообщение от XRoy Посмотреть сообщение
Вы просто сравните IL код, он идентичен
Ну я верю. Это нужно показать Anderok.

Не по теме:

Не для сильной нужды, а для кругозора: у меня VS2013. Я подключил Microsoft Windows SDK for Windows 7, теперь в оболочке можно запустить дисассемблер. Только он у меня показывает очень маленький кусок кода.
// warning : THIS IS A PARTIAL DISASSEMBLY, NOT SUITABLE FOR RE-ASSEMBLING
А самого main там нет
Как сделать полный вывод кода?

0
116 / 116 / 70
Регистрация: 10.11.2013
Сообщений: 445
01.12.2014, 11:40
CSharp_user, по идее, можно через илдасм открывать, тогда всё будет.
0
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
01.12.2014, 12:00  [ТС]
Цитата Сообщение от Anderok Посмотреть сообщение
по идее, можно через илдасм открывать, тогда всё будет.
Не, если "через", то я настроил и у меня и так прекрасно открывается во внешнем окне при выборе Tools -> IL disassembler. При этом вызывается "Microsoft .NET Framework IL disassembler". Но это как бы внешняя программа. А если выводить в окно, то выводится маленький кусок.
Странно, что нет встроенного в VS2013 инструмента.
Ну ладно, этого хватит, все равно почти не пользуюсь.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9670 / 4823 / 762
Регистрация: 17.04.2012
Сообщений: 9,661
Записей в блоге: 14
01.12.2014, 17:48
Цитата Сообщение от CSharp_user Посмотреть сообщение
Странно, что нет встроенного в VS2013 инструмента
В студию встроен дизассемблер (до машинных команд, не до IL).

А ILDasm входит в Microsoft SDK, который идёт рука об руку со студией, так что ничего удивительного.
На практике, я пользуюсь им только для участия в подобных спорах, больше никогда
0
5 / 5 / 4
Регистрация: 11.10.2014
Сообщений: 57
02.12.2014, 18:14  [ТС]
Цитата Сообщение от tezaurismosis Посмотреть сообщение
В студию встроен дизассемблер
У меня почему-то только в режиме отладки, да и то не активен:
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9670 / 4823 / 762
Регистрация: 17.04.2012
Сообщений: 9,661
Записей в блоге: 14
02.12.2014, 18:32
Цитата Сообщение от CSharp_user Посмотреть сообщение
только в режиме отладки
Именно - только в отладке. Почему неактивен - точно не скажу, стоит написать немного кода и пройтись по нему через точки останова, может появится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2014, 18:32
Помогаю со студенческими работами здесь

Префиксная и постфиксная запись инкремента
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;rus&quot;); int х = 1; int a = 0;

Операции инкремента и декремента (префиксная и постфиксная версия). Подскажите.
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () { setlocale(LC_ALL,...

В программе префиксная форма инкремента не работает
Ребят, подскажите пожалуйста, почему программа считает сначала x*5, потом прибавляет к полученному 50, и только потом увеличивает x на 1. И...

Постфиксная и префиксная запись в выражении
Иметься такой код: int a = 3; printf(&quot;%d&quot;, (++a) * (++a)); // Выведет на экран 25 Вроде все нормально, но результат меняется, если...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru