Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Dangelo
7 / 7 / 1
Регистрация: 28.11.2010
Сообщений: 57
#1

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

01.09.2011, 23:09. Просмотров 436. Ответов 6
Метки нет (Все метки)

добрый вечер. Растолкуйте плиз почему в программе:
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.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2011, 23:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос о приоритетах (C++):

Вопрос по массивав, "институтский" вопрос. - C++
Готовлюсь к летней сессии по программированию. С++ Есть такая вот задачка (привожу как есть) В документации подобного не...

вопрос - C++
здрасте всем ,хочу научиться программировать ,подскажите где взять среду с\с++ и с чего вообще начать обучение ,я чайник полный :)

вопрос - C++
Есть код программы , в конце программы должен запрашеватся вопрос , продолжить выполнения программы да/нет если &quot;да&quot; то программа...

Вопрос по C++ - C++
Сколько байт памяти займут займут три структурных переменные типа time, если структура вмещает 3 поля типа int

Вопрос по #if - C++
const LEVEL = 4; #if LEVEL == 5 cout &lt;&lt;5&lt;&lt;endl; #elif LEVEL == 4 cout &lt;&lt;4&lt;&lt;endl; #else cout...

Вопрос - C++
Такая задача возникла... Есть класс например: class tempClass { public: const int size; tempClass(){size=100;} };

6
Bers
Заблокирован
01.09.2011, 23:19 #2
если сделать вот так:
C++
1
2
    cout << cl.sum<<endl;
    cout << cl.f(4);

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

Только варнинг есть - приведение типов от инт к флоат.
1
Dangelo
7 / 7 / 1
Регистрация: 28.11.2010
Сообщений: 57
01.09.2011, 23:27  [ТС] #3
меня интересует почему именно так выводиться?)
0
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
1
kazak
3048 / 2369 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
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.
2
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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.

Ответ тут.
3
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
02.09.2011, 01:46 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от kazak Посмотреть сообщение
Тоже самое как и для цепочечного присваивания a=b=c=3.
Нет, операторы << и >> выполняются слева направо, в отличие от оператора присваивания. Но это не означает, что операнды будут вычисляться в таком же порядке. Как уже было сказано, порядок вычисления операндов в выражении не определён.
3
02.09.2011, 01:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2011, 01:46
Привет! Вот еще темы с ответами:

Вопрос - C++
Никто не знает как можно вот эту программу переделать в язык паскаль #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;malloc.h&gt; void...

Вопрос по if, else? - C++
Как сделать так чтобы программа работала по таком принципу: 1. Проверяется первое условие если оно верно - выводится оператор за ним. ...

Вопрос - C++
Приветствую Вас! 1. Необходимо просто описать как это должно работать: Дано: {max (a,b), y= {min(a,b), {|a+b|, если х=0,...

Вопрос - C++
а зачем все эти задачки? и где то читал что программисту нужно знать матрицы-а зачем?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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