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

Вопрос о приоритетах - C++

Восстановить пароль Регистрация
 
Dangelo
7 / 7 / 1
Регистрация: 28.11.2010
Сообщений: 57
01.09.2011, 23:09     Вопрос о приоритетах #1
добрый вечер. Растолкуйте плиз почему в программе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class t
{ public: int sum;
  float f(int a)
  { 
     sum++;
     return sum * a;
  }
} cl;
int main()
{ 
   cl.sum = 10;
   cout << cl.sum << "  " << cl.f(4);
}
выводиться 11 44 вместо 10 44.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2011, 23:09     Вопрос о приоритетах
Посмотрите здесь:

C++ Вопрос
C++ Вопрос по if, else?
вопрос.. C++
C++ Вопрос по #if
Вопрос C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
01.09.2011, 23:19     Вопрос о приоритетах #2
если сделать вот так:
C++
1
2
    cout << cl.sum<<endl;
    cout << cl.f(4);

то все будит нормально.

Только варнинг есть - приведение типов от инт к флоат.
Dangelo
7 / 7 / 1
Регистрация: 28.11.2010
Сообщений: 57
01.09.2011, 23:27  [ТС]     Вопрос о приоритетах #3
меня интересует почему именно так выводиться?)
Bers
Заблокирован
01.09.2011, 23:38     Вопрос о приоритетах #4
по поводу того, почему 11, а не 10 - смотрите в сторону cout.flush()

Добавлено через 10 минут
в общем, если в кратце, то
Цитата Сообщение от Dangelo Посмотреть сообщение
cout << cl.sum << " *" << cl.f(4);

в момент когда прошла cout << cl.sum в консоли ещё ничего не высветилось. Данные - попали в буффер потока, но не высветились.

когда прошла << cl.f(4); данные так же попали в буффер, но ещё не высветились.

Потом - конец программы, у потока срабатывает деструктор, а внутри него что то типа такого:

C++
1
2
3
4
ostream::~ostream()
  {
      flush();       // сброс
  }
вот, только в этот момент данные улетают в консоль. А в этот период времени, данные о классе уже модифицированы - sum равна не 10, а 11.

Как точно устроен буффер стандартного потока я не знаю, и что именно улетает в буффер - типа копии информации, или указатель на информацию, или как - я точно сам не знаю.
Но по видимому, в буффер улетает указатель на данные, а не сами данные.
Поэтому, изменяя данные до того, как будит сделанн флюш, можно изменять ту информацию, что будит выведена на экран.

Вот здесь есть неплохая статья, но я не вчитывался:
http://coderov.net/cpp/62-theorycpp/110-flows.html
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
01.09.2011, 23:59     Вопрос о приоритетах #5
Bers, не совсем так. Просто сцепленные операторы поместить в поток вычисляются справа на лево. Простой пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream.h>
 
int f(int i)
{
   cout << "Hello from function " << i << endl;
   return i;
}
 
int main(int argc, char* argv[])
{
   cout << f(4) << ' ' << f(10) << endl;
   system("pause");
   return 0;
}
Тоже самое как и для цепочечного присваивания a=b=c=3.
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,663
02.09.2011, 00:00     Вопрос о приоритетах #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Dangelo Посмотреть сообщение
добрый вечер. Растолкуйте плиз почему в программе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class t
{ public: int sum;
 float f(int a)
 { 
 sum++;
 return sum * a;
 }
} cl;
int main()
{ 
 cl.sum = 10;
 cout << cl.sum << " " << cl.f(4);
}
выводиться 11 44 вместо 10 44.

Ответ тут.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 01:46     Вопрос о приоритетах
Еще ссылки по теме:

C++ вопрос
C++ Вопрос
C++ Вопрос по C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
02.09.2011, 01:46     Вопрос о приоритетах #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kazak Посмотреть сообщение
Тоже самое как и для цепочечного присваивания a=b=c=3.
Нет, операторы << и >> выполняются слева направо, в отличие от оператора присваивания. Но это не означает, что операнды будут вычисляться в таком же порядке. Как уже было сказано, порядок вычисления операндов в выражении не определён.
Yandex
Объявления
02.09.2011, 01:46     Вопрос о приоритетах
Ответ Создать тему
Опции темы

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