Форум программистов, компьютерный форум CyberForum.ru

Указатели: почему так происходит? Постфиксный и префиксный инкремент - C++

Восстановить пароль Регистрация
 
Suslo
2 / 2 / 0
Регистрация: 30.11.2013
Сообщений: 80
Завершенные тесты: 1
07.05.2014, 16:17     Указатели: почему так происходит? Постфиксный и префиксный инкремент #1
В общем, вот код программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double q[10];
    for (int i(0);i<10;i++)
    {
        q[i]=i;
    }
    cout<<q<<endl;
    double* d=q;
    cout<<d<<" "<<&d<<endl<<"*d="<<*d<<endl;
    d++;
    cout<<"adress 0x"<<d<<" значение "<<*d<<" значение из массива "<<q[1]<<endl;
    double c;
    d++;
    (*d)++;
    cout<<*d<<" "<<q[2]<<endl;
    //39:50
    system("Pause");
интересна строка
C++
1
2
(*d)++;
    cout<<*d<<" "<<q[2]<<endl;
Выводит 3 и 3. Но, если я пытаюсь объединить эти две строки в одну, то есть
C++
1
cout<<(*d)++<<" "<<q[2]<<endl;
То получаю значения 2 и 3. Я понимаю, что разыменовывание и инкремент меняют значения массива. Вопрос заключается в том, почему он не выводит сразу "3 и 3", а выводит сначала именно "2", а затем "3"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2014, 16:17     Указатели: почему так происходит? Постфиксный и префиксный инкремент
Посмотрите здесь:

C++ постфиксный, и префиксный экземпляры оператора приращения в чем разница
C++ Потокобезопасен ли префиксный инкремент/декремент?
потоки почему так происходит ? C++
Префиксный и постфиксный инкремент C++
Постфиксный и префиксный декремент C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4303 / 3724 / 1255
Регистрация: 14.04.2014
Сообщений: 14,579
07.05.2014, 16:21     Указатели: почему так происходит? Постфиксный и префиксный инкремент #2
Попробуй ++(*d)
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
07.05.2014, 16:27     Указатели: почему так происходит? Постфиксный и префиксный инкремент #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Suslo Посмотреть сообщение
cout<<(*d)++<<" "<<q[2]<<endl;
потому что переменная инкрементируется после вывода на экран, если инкремент записать в префиксной форме, но сначала будет увеличение переменной, а затем вывод. То есть результат будет 3 3
Постфиксный инкремент означает что сначала над операндом будут выполнятся некие действия, и только затем будет задейстован оператор инкремента
В префиксной же форме все наоборот, сначала операнд увеличится, и только затем будут выполнятся действия над ним
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
07.05.2014, 16:28     Указатели: почему так происходит? Постфиксный и префиксный инкремент #4
если пост|инкремент (a++) используется в выводе, сначала выводится информация, потом происходит увеличение ++.
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,620
07.05.2014, 17:25     Указатели: почему так происходит? Постфиксный и префиксный инкремент #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Gygocopter Посмотреть сообщение
если пост|инкремент (a++) используется в выводе, сначала выводится информация, потом происходит увеличение ++.
Нет, вывод в любом случае будет после инкремента.
Постфиксный инкремент отличается от префиксного тем, что значение увеличивается, но возвращается старое значение, т.е. значение до увеличения. Представь, что инкремент - это вот такая функция (псевдокод):
C++
1
2
3
4
5
6
int postinc(int & value)
{
    int tmp = value;
    value = value + 1;
    return tmp;
}
Тогда как префиксный инкремент выразился бы в такую функцию:
C++
1
2
3
4
5
int & preinc(int & value)
{
    value = value + 1;
    return value;
}
Gygocopter
10 / 10 / 5
Регистрация: 05.02.2014
Сообщений: 124
07.05.2014, 17:35     Указатели: почему так происходит? Постфиксный и префиксный инкремент #6
DrOffset, спасибо, запомним.
Yandex
Объявления
07.05.2014, 17:35     Указатели: почему так происходит? Постфиксный и префиксный инкремент
Ответ Создать тему
Опции темы

Текущее время: 09:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru