Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64

Что с выводом на консоль?

10.02.2014, 21:42. Показов 1012. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется классическая функция рекурсивного поиска чисел Фибоначчи. Вывод на консоль ведёт себя неожиданно.

Вот в этом варианте

C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
long long int counter=0;
 
template <class T>
T fib(T n)
{
 
    counter++;
    if (n==0||n==1)
        return n;
    else
        return fib(n-1)+fib(n-2);
 
}
int main()
{
    long long int k=4;
 
    cout << fib(k) << "\t" << counter << endl;
 
    cout << "Hello World!" << endl;
    return 0;
}
на консоль выводится, что значение счётчика равно 0. Почему ? Причём оно действительно меняется во время работы функции. Стоит только заменить вывод на
C++ (Qt)
1
cout << fib(k) << "\t"; cout << counter << endl;
,
всё начинает работать нормально. Это что же, получается, в cout сначала попадает значение глобальной переменной и только потом результат расчёта чисел Фибоначчи? А с какой стати? Вызов функции идёт раньше.

Добавлено через 9 минут
Вот ещё что обнаружилось:
C++ (Qt)
1
2
3
int a=1;
 
    cout << a << "\t" << ++a << endl;
Компилятор сообщает, что результат может быть не определён. Выводятся две двойки. И вот почему ? Вообще где можно почитать про очерёдность выполнения в таком случае ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2014, 21:42
Ответы с готовыми решениями:

Что то с выводом в консоль
Ребят нужна помощь Простенькая программка объявляю динамический массив на 10 элементов и пытаюсь вывести их в консоль на VC++ 2008 ...

Ошибка с выводом в консоль
Добрый день столкнулся с такой проблемой в с++ 2008; #include &quot;stdafx.h&quot; int _tmain(int argc, _TCHAR* argv) { int i, c, k; ...

Работа с выводом в консоль
Решил зафигачить небольшой рогалик в консоли на Java, но понял, что совершенно не умею работать с консолью. Вообщем-то я ищу такие методы,...

18
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
10.02.2014, 21:50
Цитата Сообщение от mariko_11 Посмотреть сообщение
на консоль выводится, что значение счётчика равно 0. Почему ?
потому что cout сначала узнает counter , а затем выполняет функцию фибоначи.

Вот так должно работать:
C++
cout << fib(k) << "\t";
cout << counter << endl;
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2014, 21:57
Цитата Сообщение от mariko_11 Посмотреть сообщение
Компилятор сообщает, что результат может быть не определён. Выводятся две двойки. И вот почему ? Вообще где можно почитать про очерёдность выполнения в таком случае ?
Порядок вычисления аргументов не определен. Нельзя закладываться на поведение типа такого:
C++
1
foo(a, a++);
Т.к. в зависимости от реализации порядок может быть произвольным. Следовательно в общем случае предсказать результат нельзя. Отсюда правило, нельзя допускать одновременного доступа на чтение и на запись (или несколько раз на запись) одной и той же переменной в одном выражении. Раньше (в стандарте) был термин "точка следования". В гугле много ссылок.

Почитать также можно в стандарте (как и все остальное связанное с языком):
8.3.6/9:
The order of evaluation of function arguments is unspecified.
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.02.2014, 22:12
Цитата Сообщение от mariko_11 Посмотреть сообщение
C++
1
cout << a << "\t" << ++a << endl;
Ежели не желаете себе головной боли, лучше эти штучки бросить. Писать по-честному
C++
1
2
cout << a << "\t" << a+1 << endl;
++a;
Исследуете возможности и закоулки? Бог в помощь!
Поймите, K&R просто шутили тогда от избытка молодой своей энергии и от естественного восторга перед творением своим. Да, синтаксически все правильно. А вот семантику этого хозяйства надо знать на приличном уровне.

Не по теме:

"Фома, идите как все, по камушкам"

0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
10.02.2014, 22:28  [ТС]
Если не знать возможности и закоулки, может случиться быдлокод. Так что про камушки было лишнее.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.02.2014, 22:42
mariko_11, Ежели желаете себе головной боли - да кто ж посмеет вас остановить! Ваша голова - вам ее и лечить!
Цитата Сообщение от mariko_11 Посмотреть сообщение
может случиться быдлокод
Может. Уже случился. Ваш код невнятен и труден в разборке. Я не завидую тем, кто в вашем коде будет разбираться по долгу службы. Надеюсь, это произойдет еще не скоро.
0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
10.02.2014, 22:49  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
mariko_11, Ежели желаете себе головной боли - да кто ж посмеет вас остановить! Ваша голова - вам ее и лечить! Может. Уже случился. Ваш код невнятен и труден в разборке. Я не завидую тем, кто в вашем коде будет разбираться по долгу службы. Надеюсь, это произойдет еще не скоро.
А никак нельзя было ответить без хамства? Про внятность учебного кода из трёх строчек, предназначенного для различных экспериментов над ним, - порадовало особенно. А если уж случится обнаружить неожиданное свойство, о котором особо не говорят, на форуме спрашивать, конечно же, нельзя. Это ж вы...пендрёж, не иначе. Делать нечего больше, что ли, - так самоутверждаться за счёт задающих вопросы?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.02.2014, 22:56
Точки следования
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.02.2014, 23:40
Цитата Сообщение от mariko_11 Посмотреть сообщение
без хамства
Уважаемый. Если вы мне покажете, где именно вы усмотрели хамство с моей стороны, буду весьма благодарен. Всеми способами старюсь этого избежать. Хотя, если по-честному, иногда и хочется.
0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
10.02.2014, 23:46  [ТС]
Это как раз тот случай: если надо объяснять, то не надо объяснять.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
10.02.2014, 23:50
Цитата Сообщение от mariko_11 Посмотреть сообщение
Это как раз тот случай: если надо объяснять, то не надо объяснять.

Не по теме:

ИМХО, вы далеко пойдете. Демагогия - ваш конек. желаю удачи.

0
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
10.02.2014, 23:53  [ТС]
По поводу последней статьи:
Несколько присваиваний подряд
Интересный момент с таким кодом:
int a=1, b=2, c=3;
a=b=c=0;
Стандарт как-то очень нечетко описывает такую ситуацию. Он говорит, что операция должна происходить справа налево, но ничего не говорит дополнительно по поводу того, когда должен быть результат этой операции записан в переменную. Точек следования внутри выражения нет, что значит, что компилятор может теоретически творить здесь что угодно и не обязательно все переменные в итоге будут равны 0.
А не всё ли равно, когда результат записывается в переменные? Значения-то определены.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
10.02.2014, 23:56
Друзья, не ссорьтесь. Закоулки знать надо (иначе можешь не понять что написал другой, но менее опытный любитель закоулков), но знать и границы дозволенного. Есть ситуации, когда оно нужно, а есть - когда вредно. Профессионализм - в умении различать эти ситуации.

По поводу закоулков есть где поучиться.
И далее, там много частей.
В основном в контексте reverse engineering, хоть (вроде) и не сказано об этом явно.
1
10.02.2014, 23:57

Не по теме:

Цитата Сообщение от mariko_11 Посмотреть сообщение
если надо объяснять, то не надо объяснять
Что-то философское. Это Лао-Цзы?
Единство и борьба противоположностей...
Инь-янь...
:jokingly:

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.02.2014, 00:01
Цитата Сообщение от mariko_11 Посмотреть сообщение
А не всё ли равно, когда результат записывается в переменные? Значения-то определены.
Алена в этом случае немножко перестаралась. Тут реально будет все нормально. Просто порядок зануления не определен. Но нулями в итоге будут все.
0
11.02.2014, 00:02  [ТС]

Не по теме:

Это когда очевидные вещи не очевидны. Бесполезно распинаться.

0
11.02.2014, 00:03

Не по теме:

Цитата Сообщение от mariko_11 Посмотреть сообщение
Это когда очевидные вещи не очевидны. Бесполезно распинаться
Вы хотите сказать Метать бисер перед свиньями?

0
11.02.2014, 00:04  [ТС]

Не по теме:

Типа того.

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
11.02.2014, 00:11
Поправлюсь, в новом стандарте даже более четкая формулировка:
5.17/1
The assignment operator (=) and the compound assignment operators all group right-to-left. All require a
modifiable lvalue as their left operand and return an lvalue referring to the left operand. The result in all
cases is a bit-field if the left operand is a bit-field. In all cases, the assignment is sequenced after the value
computation of the right and left operands, and before the value computation of the assignment expression.
With respect to an indeterminately-sequenced function call, the operation of a compound assignment is
a single evaluation.
[Note: Therefore, a function call shall not intervene between the lvalue-to-rvalue
conversion and the side effect associated with any single compound assignment operator.
—end note ]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2014, 00:11
Помогаю со студенческими работами здесь

Выводом строки в консоль
Задача такова. Ввести с клавиатуры имя. Программа заносит это имя в STR и выводит Hello, %STR%. Но выводит она кракозябру. .model small ...

Уравнение с выводом ответа в консоль
Есть уравнение из двух систем первая y1= x-2, если x&gt;=2; 8 если x&lt;2; вторая 4 если x=0, a-x если x&lt;&gt;0 Есть кое-какие наброски,...

Консоль с выводом и вводом одновременно
Всем привет, тут такое дело появилось, у меня приложение работает, всё ок и выводит в консоль print-ом, то, что мне нужно, но проблема в...

Разбор json с выводом в консоль
не получается разобрать json { &quot;_embedded&quot;: { &quot;sort&quot;: &quot;&quot;, &quot;items&quot;: , &quot;limit&quot;: 2, &quot;offset&quot;: 0, ...

PING в Python с выводом в консоль
Доброго времени суток уважаемые знатоки Python, Появилась необходимость каждое утро сообщать шефу о доступности наших устройств (NVR)...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru