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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
#1

Дребедень с указателями хэлп - C++

11.09.2011, 19:01. Просмотров 977. Ответов 24
Метки нет (Все метки)

Здравствуйте, форумчане. Изучаю с++, дошёл до указателей. Душа потребовала эксперементов. Прежде чем обяъявить проблему ,подумайте, какой ответ должна дать следующая программа на с++:
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
#include <iostream.h>
#include <conio.h>
 
int modify(int *);
 
main ()
{
   int x = 10;
 
   cout << "modify(x) = " << modify(&x) << endl << "x = " << x << endl;
 
 
   getch();
 
 
   return 0;
}
 
int modify(int *y)
{
   *y = 1;
 
   return *y;
}
По идее (по моей идее), используя указатель *у, х доже модифицируется, должен быть ответ:
modify(x) = 1, а x = 1

Но у меня х = 10

Народ, подскажите, в чём проблема, точнее в чём моя проблема?

PS. Если перед cout вызвать функцию modify(&x), выдаёт правильный ответ (х = 1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2011, 19:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дребедень с указателями хэлп (C++):

Хэлп по лабораторной 2 - C++
Я прошу прощения, понимаю что выгляжу глупо, но не мог бы кто помочь с остальными 8 вопросами - не все зарегистрированы в контакте,...

хэлп с лабой) - C++
1. В файле в каждой строке заменить ту комбинацию из трех символов, которая чаще всех встречается в строке, на символ '&amp;'. 2. В...

Хэлп с функциями - C++
1.Написать функцию, которая умножает поэлементно 2 массива. Параметрами функции должны быть оба массива и массив, в который записывается...

Не получается с указателями :( - C++
Программа считывает строки из файла и суммирует строки в строку str_new, при это создавая указатели на каждую новую строку которая была...

Прикол с указателями - C++
взял пример с http://www.cplusplus.com/reference/algorithm/find/, немного поэксперементировал и наткнулся на необъяснимый факт) Смотрим: ...

Вектор с указателями - C++
Доброго времени суток, есть такой код: // 1159.cpp : Defines the entry point for the console application. // #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 20:45 #16
soon, при передаче в cout сначала берётся значение x, и только потом modify(x), потому и выводится так, как выводится...
Ну т.е. при
C++
1
std::cout << f(&x) << x;
сначала выводится непосредственно x, затем вызывается f(&x), которое передает в поток значение f(&x), и именно поэтому x выводится ихзначальное, а не то, которое должно получится после f()?
Ну дак я это и не отрицал.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
11.09.2011, 20:47 #17
Цитата Сообщение от soon Посмотреть сообщение
сначала выводится непосредственно x, затем вызывается f(&x), которое передает в поток значение f(&x), и именно поэтому x выводится ихзначальное, а не то, которое должно получится после f()?
Нет, выводиться в том порядке, в котором мы пишем. Дело в том - в какой последовательности аргументы кладутся в стек. Значение x будет положенно до вызова ф-ции и больше меняться не будет, отсюда и такой вывод.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 20:53 #18

Не по теме:

Ааа, я кажется понял. Вот это

Почему? Посмотрите сообщение #2
относилось к возможному встречному вопросу от viktorrrr-а. И, соответственно, не означало, что я не согласен с тем, что cout обрабатывает справа налево.



Добавлено через 2 минуты
Нет, выводиться в том порядке, в котором мы пишем. Дело в том - в какой последовательности аргументы кладутся в стек. Значение x будет положенно до вызова ф-ции и больше меняться не будет, отсюда и такой вывод.
Все правильно. Это я не так выразился. Разумеется будет выводить в нужном порядке
emilen
10 / 10 / 0
Регистрация: 25.05.2010
Сообщений: 52
11.09.2011, 21:34 #19
Точно не помню, но поведение cout не определенно, так что полагаться на то, что будет справа или слева лучше не надо, а сделать примерно, как сделал soon.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
11.09.2011, 21:49 #20
Кому интересно может также погуглить на эту тему, а конкретно на форуме VPF находил топик, в котором обсуждалось поведение cout. На трех разных компиляторах выводило три разных ответа.

Добавлено через 2 минуты
И можете даже не гуглить, я нашел линк. Вот
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
11.09.2011, 22:17 #21
На самом деле разные ответы запросто можно получить на одном компиляторе
На примере студии 2008:

D:\Temp\test\vc>cl /EHsc ptr.cpp /nologo
ptr.cpp

D:\Temp\test\vc>ptr.exe

modify(x) = 1
x = 10

D:\Temp\test\vc>cl /EHsc /O2 ptr.cpp /nologo
ptr.cpp

D:\Temp\test\vc>ptr.exe

modify(x) = 1
x = 1
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
13.09.2011, 10:11  [ТС] #22
Цитата Сообщение от Kastaneda Посмотреть сообщение
Нет, выводиться в том порядке, в котором мы пишем. Дело в том - в какой последовательности аргументы кладутся в стек. Значение x будет положенно до вызова ф-ции и больше меняться не будет, отсюда и такой вывод.
Эти сообщения (#16 #17) многое для меня прояснили. Вывод: сначала значения записываются в стек (справа на лево), потом выводятся на экран - с помощью стека. Начинаю немного понимать для чего нужен стек и с чем его (едят) юзают.

Kastaneda, где можно просмотреть код асмы в компилере, как в вашем 13 сообщении?

Спасибо всем!
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.09.2011, 11:21 #23
Пожалуй эту тему тоже стоит прикрепить, так как регулярно появляется этот вопрос про std::cout и регулярно ответы на него про стек и лево-право.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
13.09.2011, 12:09 #24
Цитата Сообщение от Mr.X Посмотреть сообщение
Пожалуй эту тему тоже стоит прикрепить, так как регулярно появляется этот вопрос про std::cout и регулярно ответы на него про стек и лево-право.
причём не помогают даже примеры, которые явно показывают, что порядок не определён
Сыроежка
Заблокирован
13.09.2011, 19:07 #25
Цитата Сообщение от dimcoder Посмотреть сообщение
Здравствуйте, форумчане. Изучаю с++, дошёл до указателей. Душа потребовала эксперементов. Прежде чем обяъявить проблему ,подумайте, какой ответ должна дать следующая программа на с++:
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
#include <iostream.h>
#include <conio.h>
 
int modify(int *);
 
main ()
{
   int x = 10;
 
   cout << "modify(x) = " << modify(&x) << endl << "x = " << x << endl;
 
 
   getch();
 
 
   return 0;
}
 
int modify(int *y)
{
   *y = 1;
 
   return *y;
}
По идее (по моей идее), используя указатель *у, х доже модифицируется, должен быть ответ:
modify(x) = 1, а x = 1

Но у меня х = 10

Народ, подскажите, в чём проблема, точнее в чём моя проблема?

PS. Если перед cout вызвать функцию modify(&x), выдаёт правильный ответ (х = 1)

Тут вам наговорили всякой всячины, которая совершенно неверная!

Во-первых, что представляет из себя строка вашего кода

C++
1
cout << "modify(x) = " << modify(&x) << endl << "x = " << x << endl;
Это вложенные вызовы перегруженной оператора функции <<, Фактически, это следующий код

C++
1
operator( operator( operator( operator( opertaor( operator << ( cout,  "modify(x) = " ), modify(&x) ), endl  ), "x = " ), x ), endl );
То есть ваша переменная 'x' является вторым аргументом в предпоследнем внешнем вызове оператор функции. Так как стандарт не устанавливает порядок вычисления аргументов функции
, то совсем необзяательно, что сначала будет вызвана функция modify(&x) , а затем вычислено значение переменной 'x'. Напротив, чаще всего компиляторы, исходя из соглашений языка С++ для ассемблера по помещению аргументов в стек, начинают вычислять выражения аргументов справа налево! Именно это и произошло в вашем случае! То есть ваш компилятор сначала вычислил правый аргумент оператор-функции << - 'x', а затем вычислил значение левого аргумента, то есть то выражение, где происходит вызов функции modify(&x) .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2011, 19:07
Привет! Вот еще темы с ответами:

Работа с указателями - C++
Написать программу, в которой выполнить следующие действия: 1) Описать указатели на все известные типы данных; 2. Выполнить для каждого...

Массив. с указателями с++ - C++
1. Задан массив из 10 целых чисел. Посчитать количество смен знаков заданных чисел. Перебор элементов массива должен осуществляться...

работа с указателями - C++
Как ПРАВИЛЬНО передать в функцию, массив, используя адресацию? Программа находит в массиве слово и перед ним вставляет какое то слово, то...

Проблема с указателями. - C++
Доброго времени суток. Такой вопрос: если имеется массив указателей на объекты, как удалить из i-ой ячейки указатель или занулить его? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.09.2011, 19:07
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru