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

Непонятная работа вывода - C++

Восстановить пароль Регистрация
 
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
02.01.2012, 02:03     Непонятная работа вывода #1
Почему при выводе переменной а выводится 1, хотя перед тем как вывести ее выполняется lol(а)?
Причем, при следующем выводе а выводится правильное значение(2).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int lol(int &a)
{
    a++;
    return 0;
}
 
int main()
{
    int a=1;
    printf("%i %i \n",lol(a),a);
    printf("%i\n",a);
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2012, 02:03     Непонятная работа вывода
Посмотрите здесь:

Организация файлового ввода/вывода (работа с текстовыми и двоичными файлами) C++
Непонятная ошибка C++
C++ Непонятная ошибка
C++ задача непонятная
C++ Непонятная ошибка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
02.01.2012, 02:09     Непонятная работа вывода #2
C++
1
2
3
4
int lol(int a)
{
   return ++a;
}
Или
C++
1
2
3
4
void lol(int &a)
{
a++;
}
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
02.01.2012, 02:25  [ТС]     Непонятная работа вывода #3
Цитата Сообщение от Dekio Посмотреть сообщение
Или
Неважно просто для void нет перегрузки << (я сначала на с++ написал)

Я нашел такую вещь! В relize всё работает верно (2 2), а в debug (1 2)!
компилятор msvs 2010

Добавлено через 11 минут
Цитата Сообщение от oniks Посмотреть сообщение
Неважно просто для void нет перегрузки << (я сначала на с++ написал)
2ой вариант, простите невнимательно прочитал.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2012, 02:43     Непонятная работа вывода #4
Цитата Сообщение от oniks Посмотреть сообщение
Почему при выводе переменной а выводится 1, хотя перед тем как вывести ее выполняется lol(а)?
с чего вы это взяли? порядок вычисления параметров функции лежит на совести разработчиков компилятора, в одном компиляторе справа налево в другом слева направо

Добавлено через 1 минуту
Цитата Сообщение от oniks Посмотреть сообщение
Причем, при следующем выводе а выводится правильное значение(2).
следующий вывод выводит уже вычисленное значение
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
02.01.2012, 02:50  [ТС]     Непонятная работа вывода #5
Цитата Сообщение от Jupiter Посмотреть сообщение
с чего вы это взяли? порядок вычисления параметров функции лежит на совести разработчиков компилятора, в одном компиляторе справа налево в другом слева направо
Прошел дебаггером и получилось, что сначала выводится lol(a), а потом а.
Цитата Сообщение от Jupiter Посмотреть сообщение
следующий вывод выводит уже вычисленное значение
Ну это то понятно.

Я так понимаю что компилятор в дебаге делает код так как есть.А после оптимизации в релизе у нас выполняется совсем другая последовательность.Только вот это не совсем логично, т.к. нарушает логику выполнения программы.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2012, 02:58     Непонятная работа вывода #6
oniks, вы не поняли, четких ограничений на вычисление параметров функции нет, это значит что компилятор вправе проводить над ними любые оптимизации и то что вызов функции стоит левее изменяемой переменной не значит что сначала вызовится функция. Почитайте о точках следования, в частности там описано и про параметры функций
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
02.01.2012, 03:02  [ТС]     Непонятная работа вывода #7
Цитата Сообщение от Jupiter Посмотреть сообщение
oniks, вы не поняли, четких ограничений на вычисление параметров функции нет, это значит что компилятор вправе проводить над ними любые оптимизации и то что вызов функции стоит левее изменяемой переменной не значит что сначала вызовится функция. Почитайте о точках следования, в частности там описано и про параметры функций
Вообще-то понял. Интересно, почему нет таких ограничений, ведь это ведёт к ошибкам.

Цитата Сообщение от Jupiter Посмотреть сообщение
Почитайте о точках следования, в частности там описано и про параметры функций
Большое спасибо, очень интересная статья.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
02.01.2012, 03:57     Непонятная работа вывода #8
а я вот не догнал. функция lol(int& a) возвращает 0, а printf() в stdout кидает значение "a". Это как так? что за хак баг?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2012, 04:05     Непонятная работа вывода #9
alkagolik, у меня выводит то что в коде
Код
0 1
2
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
02.01.2012, 04:24     Непонятная работа вывода #10
Jupiter, я и не пробовал, видно же. Я имею ввиду вот эту цитату
Цитата Сообщение от oniks Посмотреть сообщение
Я нашел такую вещь! В relize всё работает верно (2 2), а в debug (1 2)!
oniks, признавайся, рэпер, что ты там уже намудрил.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
02.01.2012, 11:22     Непонятная работа вывода #11
Цитата Сообщение от oniks Посмотреть сообщение
Интересно, почему нет таких ограничений, ведь это ведёт к ошибкам.
Это сделано для скорости работы, то есть производительности. Да если бы такие ограничения и были, думаете они бы не приводили к ошибкам? Многие бы о них также не знали и делали наоборот.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2012, 13:44     Непонятная работа вывода
Еще ссылки по теме:

непонятная ошибка C++
C++ Работа с двоичными файлами, организация ввода-вывода структурированной информации/
C++ Непонятная ошибка. Потоки ввода/вывода

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

Или воспользуйтесь поиском по форуму:
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
02.01.2012, 13:44  [ТС]     Непонятная работа вывода #12
Цитата Сообщение от alkagolik Посмотреть сообщение
Jupiter, я и не пробовал, видно же. Я имею ввиду вот эту цитату

oniks, признавайся, рэпер, что ты там уже намудрил.
А да я просто опустил нолик, он то понятное дело всегда первым выводится это меня и смутило.
у меня вывод такой:
0 1
2
В дебаг.
А в релиз:
0 2
2
То есть в режиме дебагинга компилятор производит какие-то свои дела и получается следующее:
У нас выводится 0 и мы понимаем, что функция отработала, однако на деле значение от a уже получено и оно не изменятся, поэтому выводится 1. Ну разумеется после выводится двойка.А чудо в том что между двумя выводами ничего с переменной не происходит, а выводятся разные значения.

Добавлено через 31 минуту
А в релизе на стадии компиляции вычисляется вывод и потом просто выводится, то бишь прога становится такой:
C
1
2
printf("0 2\n");
printf("2\n");
P.S.: у меня стоит максимальная скорость
Yandex
Объявления
02.01.2012, 13:44     Непонятная работа вывода
Ответ Создать тему
Опции темы

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