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

Функция с двумя аргументами. Второй - по умолчанию = первому

30.03.2015, 16:30. Показов 2594. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет! Есть какой - то способ задать в объявление функции второй аргумент, равный по умолчанию первому?
C++
1
void GiveMeSomeHappiness(int A, int B = A);
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.03.2015, 16:30
Ответы с готовыми решениями:

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

Excel 2007 VBA. Функция с двумя аргументами не хочет работать
Компилятор ругается, на CulculationCumulativeNormalFunction (dbDelta1, dbNDFd1) говорит что функиция ожидает :=... или через раз просто...

Указатель на функцию с аргументами по умолчанию
Можно ли вообще определить и записать подобное чудо?

12
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2015, 16:38
Цитата Сообщение от Aston Martin Посмотреть сообщение
Есть какой - то способ задать в объявление функции второй аргумент, равный по умолчанию первому?
нет, и быть не может.

это связанно с тем, что порядок вычисления аргументов функции не определен.
1
Заблокирован
30.03.2015, 16:49  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
это связанно с тем, что порядок вычисления аргументов функции не определен.
Хмм... Но по идее то согласно stdcall аргументы "пушатся" в стек по довольно таки определённую порядку
Почему бы после "пуша" первого не взять его и не приколбасить ко второму?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
30.03.2015, 16:59
Лучший ответ Сообщение было отмечено Aston Martin как решение

Решение

Aston Martin, а вы попробуйте. Интересно, что скажет компилятор? И нам расскажете...
Но если это вопрос не чисто теоретический, а имеет практический интерес, то нужного вам поведения можно добиться перегрузкой функции типа
C++
1
2
3
4
5
6
void GiveMeSomeHappiness(int A, int B)
{ ... }
void GiveMeSomeHappiness(int A)
{
 GiveMeSomeHappiness(A, A);
}
1
Заблокирован
30.03.2015, 17:12  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Интересно, что скажет компилятор?
Скажет, что
C++
1
void GiveMeSomeHappiness(int A, int B = A);
А - undeclareded identefier (ну это для второго аргумента)

Цитата Сообщение от Байт Посмотреть сообщение
добиться перегрузкой функции типа
О.. кстати, а это идея
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2015, 17:13
Цитата Сообщение от Aston Martin Посмотреть сообщение
Хмм... Но по идее то согласно stdcall аргументы "пушатся" в стек по довольно таки определённую порядку
Почему бы после "пуша" первого не взять его и не приколбасить ко второму?
не путайте порядок следования аргументов, с порядком вычисления:

C++
1
foo(  bar(), baz() );
возможно сначала запуститься bar, и только потом baz.
а может быть и наоборот.

зависит от компилятора, от его настроек, оптимизации и тп.

C++
1
void GiveMeSomeHappiness(int A, int B = A);
сначала может быть вычислено именно B,
которое будет содержать мусор, потому что A ещё в неконсистентном состоянии.
и только потом A.
0
Заблокирован
30.03.2015, 17:16  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
сначала может быть вычислено именно B,
нихрена

C++
1
2
3
4
5
bool x = false;
bool y = true;
if(x && y)
{
}
если 'x' будет false, то 'y' уже не будет проверен в IF-е и никак по другому (слева на права идёт)
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
30.03.2015, 17:33
Цитата Сообщение от Aston Martin Посмотреть сообщение
ни хрена

Не по теме:

(пишется раздельно)

Ты немножко путаешь. Это - вычисление выражения. Да, выражения, как это принято у христиан и индусов, вычисляются слева направо. А аргументы функции - совсем не так. Они даже в стек могут пушиться наоборот
0
Заблокирован
30.03.2015, 17:39  [ТС]
Цитата Сообщение от Байт Посмотреть сообщение
Они даже в стек могут пушиться наоборот
всё определяется квалификатором порядка загонки в стек типа stdcall, fastcall и тд.
По - моему уже как сто лет stdcall является дефолтным во всех компиляторах под x86 ...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2015, 18:05
Цитата Сообщение от Aston Martin Посмотреть сообщение
если 'x' будет false, то 'y' уже не будет проверен в IF-е и никак по другому (слева на права идёт)
вы не путайте хрен с редькой.
вычисление булевых выражений, и вычисления аргументов функции - это как бэ принципиально разные вещи.
1
Заблокирован
30.03.2015, 18:10  [ТС]
всё равно не понятно, почему нельзя второй аргумент приравнять к первому по умолчанию в записи объявления функции... Казалось бы, ерунда какая - то, а нет ...
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,870
30.03.2015, 18:18
Цитата Сообщение от Aston Martin Посмотреть сообщение
Казалось бы, ерунда какая - то, а нет ...
во первых на x86 свет клином не сошелся
и даже для него есть режим передачи аргументов через регистры
во вторых даже для этого режима сначала вычисляется B
Цитата Сообщение от Aston Martin Посмотреть сообщение
void GiveMeSomeHappiness(int A, int B = A);
будет выглядеть так
Assembler
1
2
3
 push B;
 push A;
call GiveMeSomeHappiness;
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.03.2015, 18:42
Цитата Сообщение от Aston Martin Посмотреть сообщение
всё равно не понятно, почему нельзя второй аргумент приравнять к первому по умолчанию в записи объявления функции... Казалось бы, ерунда какая - то, а нет ...
потому что, для того, что бы это стало возможным,
стандарту с++ потребуется четко регламентировать прядок вычисления аргументов.

а компиляторам придется этого порядка придерживаться.

что в отдельных ситуациях может больно ударить по возможностям оптимизации.

для языка, киллер-фича которого "эффективность" такое не приемлемо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2015, 18:42
Помогаю со студенческими работами здесь

Наследование и конструктор с аргументами по умолчанию
Есть некоторый абстрактный класс "объект", который наследуют все объекты (код конструктора): Object(const D3DXVECTOR3& position, ...

особая реализация функции с аргументами по умолчанию
void T(int x =20, int y = 0, int z = 2000) { cout << x << y << z << endl; } void main() { T(); T(,,0); ...

Создайте функцию с двумя аргументами
Дорого времени суток, помогите пожалуйста с задачами Создайте функцию с двумя аргументами. Задайте аргументам числовые значение....

Частная производная от функции с двумя аргументами
Как взять производную от функции только по х , не вводя значения другой переменной? Формула в конце

Определить функцию filter с двумя аргументами
Определить функцию filter с двумя аргументами. Функция работает как фильтр, который применяется для каждого элемента из списка. Функция...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru