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

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

Войти
Регистрация
Восстановить пароль
 
oniks
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
#1

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

02.01.2012, 02:03. Просмотров 731. Ответов 11
Метки нет (Все метки)

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

Непонятная ошибка. Потоки ввода/вывода - C++
Решал задачу и столкнулся с проблемой (первый день на c++ "пишу") не пойму что за ошибка #include "stdafx.h" #include <iostream> ...

Работа с потоками ввода и вывода - C++
Добрый день, всем! Пишу программу, которая бы хранила определенные данные(в моем случае строка и число) в файле на компьютере. При этом...

Работа с файлами на уровне потокового ввода-вывода с буферизацией. С++ - C++
Всем здравствуйте. Помогите пожалуйста. Необходимо обеспечить выполнение следующих действий: *ввод информации в файл; *корректировка...

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

Организация файлового ввода/вывода (работа с текстовыми и двоичными файлами) - C++
1(работа с текстовыми файлами) -Дан текстовый файл.Переписать в новый файл все его строки, вставив в конец каждый строки колличество...

Перегрузка оператора вывода в С++ (для вывода данных вектора) - C++
Как правильно перегрузить оператор вывода для вектора чтобы он выводил все данные из вектора ? Для этого класса есил можно помогите. ...

11
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 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++;
}
0
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ой вариант, простите невнимательно прочитал.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2012, 02:43 #4
Цитата Сообщение от oniks Посмотреть сообщение
Почему при выводе переменной а выводится 1, хотя перед тем как вывести ее выполняется lol(а)?
с чего вы это взяли? порядок вычисления параметров функции лежит на совести разработчиков компилятора, в одном компиляторе справа налево в другом слева направо

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

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

Цитата Сообщение от Jupiter Посмотреть сообщение
Почитайте о точках следования, в частности там описано и про параметры функций
Большое спасибо, очень интересная статья.
0
alkagolik
Заблокирован
02.01.2012, 03:57 #8
а я вот не догнал. функция lol(int& a) возвращает 0, а printf() в stdout кидает значение "a". Это как так? что за хак баг?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.01.2012, 04:05 #9
alkagolik, у меня выводит то что в коде
Код
0 1
2
0
alkagolik
Заблокирован
02.01.2012, 04:24 #10
Jupiter, я и не пробовал, видно же. Я имею ввиду вот эту цитату
Цитата Сообщение от oniks Посмотреть сообщение
Я нашел такую вещь! В relize всё работает верно (2 2), а в debug (1 2)!
oniks, признавайся, рэпер, что ты там уже намудрил.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
02.01.2012, 11:22 #11
Цитата Сообщение от oniks Посмотреть сообщение
Интересно, почему нет таких ограничений, ведь это ведёт к ошибкам.
Это сделано для скорости работы, то есть производительности. Да если бы такие ограничения и были, думаете они бы не приводили к ошибкам? Многие бы о них также не знали и делали наоборот.
0
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.: у меня стоит максимальная скорость
0
02.01.2012, 13:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2012, 13:44
Привет! Вот еще темы с ответами:

Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки - C++
Написать программу, которая должна включать функции для: - вывода шапки таблицы; - вывода данных одной строки таблицы; - ввода и...

Для вывода матрицы на экран использовать рекурсивную функцию вывода одной строки матрицы - C++
Рекурсивная функция в С++. срочно! ДЛЯ вывода матрицы на экран построчно использовать РЕКУРСИВНУЮ функцию вывода на экран одномерного...

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

Непонятная ошибка - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; int i; int fact (int n){ if ( n&lt;1 )...


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

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

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