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

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

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

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

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

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

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

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

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

это связанно с тем, что порядок вычисления аргументов функции не определен.
1
Заблокирован
30.03.2015, 16:49  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
это связанно с тем, что порядок вычисления аргументов функции не определен.
Хмм... Но по идее то согласно stdcall аргументы "пушатся" в стек по довольно таки определённую порядку
Почему бы после "пуша" первого не взять его и не приколбасить ко второму?
0
Заблокирован
Эксперт C
30.03.2015, 16:59 4
Лучший ответ Сообщение было отмечено 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  [ТС] 5
Цитата Сообщение от Байт Посмотреть сообщение
Интересно, что скажет компилятор?
Скажет, что
C++
1
void GiveMeSomeHappiness(int A, int B = A);
А - undeclareded identefier (ну это для второго аргумента)

Цитата Сообщение от Байт Посмотреть сообщение
добиться перегрузкой функции типа
О.. кстати, а это идея
0
Эксперт С++
8556 / 4132 / 908
Регистрация: 15.11.2014
Сообщений: 9,330
30.03.2015, 17:13 6
Цитата Сообщение от 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  [ТС] 7
Цитата Сообщение от hoggy Посмотреть сообщение
сначала может быть вычислено именно B,
нихрена

C++
1
2
3
4
5
bool x = false;
bool y = true;
if(x && y)
{
}
если 'x' будет false, то 'y' уже не будет проверен в IF-е и никак по другому (слева на права идёт)
0
Заблокирован
Эксперт C
30.03.2015, 17:33 8
Цитата Сообщение от Aston Martin Посмотреть сообщение
ни хрена

Не по теме:

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

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

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

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

для языка, киллер-фича которого "эффективность" такое не приемлемо.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2015, 18:42

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

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

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

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

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

Работа с двумя аргументами и ярлыками на рабочем столе
Ребят нужна помощь , первую часть задания вроде сделал, а вторую никак не могу понять как,...


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

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

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