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

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

02.01.2012, 02:03. Показов 1108. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.01.2012, 02:03
Ответы с готовыми решениями:

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

Непонятная работа потока ввода
Всем здравствуйте. Возникла проблема в связи с использованием cin.putback, прошу знающих людей просветить по данному вопросу. Допустим...

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

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

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

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

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

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

Цитата Сообщение от Jupiter Посмотреть сообщение
Почитайте о точках следования, в частности там описано и про параметры функций
Большое спасибо, очень интересная статья.
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
02.01.2012, 03:57
а я вот не догнал. функция lol(int& a) возвращает 0, а printf() в stdout кидает значение "a". Это как так? что за хак баг?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
02.01.2012, 04:05
alkagolik, у меня выводит то что в коде
Code
1
2
0 1
2
0
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
02.01.2012, 04:24
Jupiter, я и не пробовал, видно же. Я имею ввиду вот эту цитату
Цитата Сообщение от oniks Посмотреть сообщение
Я нашел такую вещь! В relize всё работает верно (2 2), а в debug (1 2)!
oniks, признавайся, рэпер, что ты там уже намудрил.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
02.01.2012, 11:22
Цитата Сообщение от oniks Посмотреть сообщение
Интересно, почему нет таких ограничений, ведь это ведёт к ошибкам.
Это сделано для скорости работы, то есть производительности. Да если бы такие ограничения и были, думаете они бы не приводили к ошибкам? Многие бы о них также не знали и делали наоборот.
0
1 / 1 / 0
Регистрация: 20.03.2011
Сообщений: 16
02.01.2012, 13:44  [ТС]
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2012, 13:44
Помогаю со студенческими работами здесь

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

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

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

Работа с структурами: выполните, используя файловые потоки для ввода/вывода
Используя тип данных запись с именем PRICE, содержащую следующие поля: • TOVAR – название товара; • KOL – количество товара; • TSENA...

Непонятная работа if
Возникла непонятная проблема с if'ом. Дело в том, что при пошаговом прохождении по программе возникает необъяснимая ситуация, когда условия...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru