Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62

Безымянный аргумент функции

03.07.2013, 12:48. Показов 7248. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
функция принимает аргумент, но у него нет имени

C++
1
2
3
4
5
6
7
8
9
10
11
void f(int)
{
    cout << "Hello world!";
}
 
int main()
{
    int n = 10;
    f(n);
    return 0;
}
Добавлено через 13 минут
...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2013, 12:48
Ответы с готовыми решениями:

Вычислить значение функции аргумент которой вычисляется из другой кусочно заданной функции
Решите программу то я не знаю как:hysteric: Вычислить значение y в зависимости от выбранной функции \varphi (x), аргумент которой...

Беззнаковый аргумент функции
Всем привет. Есть вопрос по уточнению типа аргументов функций. К примеру, есть функция: unsigned long int factorial(unsigned int x)...

Не читается аргумент функции
void recursReverse(char* str, size_t len) { static size_t len2 = len; while (len2 &gt; 1) { std::swap(*str, *(str + len2 - 1)...

51
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 12:11
Студворк — интернет-сервис помощи студентам
AntonChik, собственно для перегрузки такое и делают в частности. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
using namespace std;
 
int f(int x, int, int z) {
  return x+z;
}
 
int f(int x, double, int z) {
  return x*z;
}
 
int main() {
    cout << f(1,0,2) << endl;
    cout << f(1,0.,2) << endl;
        return 0;
}
https://ideone.com/pM8Yp9
2
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.07.2013, 12:11
Цитата Сообщение от Jupiter Посмотреть сообщение
причинами чего?
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
04.07.2013, 12:24
Цитата Сообщение от Tulosba Посмотреть сообщение
Уважаемый Evg, не горячитесь так. Никто не утверждал, что этот код будет переносимым. Если Вам известны какие-то иные способы получения значения безымянного параметра, было бы интересно посмотреть.
Вместо того, чтобы городить кучу дополнительного кода в функции, могу предложить изящное решение - дать имя параметру.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
Например, ты встраиваешься в чужую систему, которая пишется как универсальная на все случаи жизни. Поэтому ты обязан написать именно такой прототип функции, как требует того система. Поскольку система универсальная, а твой случай - частный, то тебе какие-то параметры могут и не понадобиться
2
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
04.07.2013, 12:24
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Причинами того, что, случается, в вызове функции стоит большее число параметров, чем на самом деле функция использует.
и чё? я вызываю функцию и мне пофигу что там используется, а что нет. если не я эту функцию писал
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.07.2013, 12:52
Цитата Сообщение от Evg Посмотреть сообщение
встраиваешься в чужую систему
Цитата Сообщение от Jupiter Посмотреть сообщение
и чё?
Не, не, не, господа. Мы говорим о случае, когда у нас есть именно такая функция. Перефразировав специально для Jupiter, зачем вы написали именно такую функцию?

Это все понятно, что, если это нас не касается, то и хрен с ним. Но охота разобраться зачем оно вообще.

Цитата Сообщение от Evg Посмотреть сообщение
дать имя параметру
А-а.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int WithName(int x, bool b)
{
  return x;
}
int WithoutName(int x, bool)
{
  return x;
}
 
int main()
{
  cout << WithName(9, NULL);
  cout << WithoutName(9, NULL);
 
  return 0;
}
Результат один и тот же.
Вопрос по прежнему открыт. Зачем существуют параметры без имени?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
04.07.2013, 13:10
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Зачем существуют параметры без имени?
Просто так. Чтобы не заводить лишнее имя в процедуре, если параметр должен быть, но он не используется. Никаких других причин нет. Когда такое бывает - написал в посте #23.

Добавлено через 7 минут
Именованный и безымянный параметры играют роль исключительно внутри функции. В точке вызова функции нет никакой разницы, будет ли внутри вызываемой функции параметр иметь имя, или нет. В точке вызова важен только тип параметра, чтобы знать, как его правильно передать. А как этот параметр будет называться внутри функции - не играет никакой роли, т.к. в точке вызова нам не нужно обращаться к этому параметру (а именно для этого нужно имя переменой). Вернее, обращаться нужно в момент передачи параметра, но обращаемся к нему не по имени, а, грубо говоря, по порядковому номеру внутри круглых скобок в строгом соответствии с программными соглашениями (calling convenience)
2
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
04.07.2013, 13:20
Но самое-то интересное - можно ли получить внутри функции значение параметра, переданного без имени? Весь сыр-бор из-за этого.
0
12 / 10 / 0
Регистрация: 01.07.2013
Сообщений: 62
04.07.2013, 13:33  [ТС]
Зачем существуют параметры без имени?
я сейчас вспомнил про перегруженные операции постфиксного инкремента и декремента
C++
1
2
operator++(int);
operator--(int);
в них аргумент как бы и не нужен, а введен только для того, чтобы были различия от префиксных операторов
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
04.07.2013, 13:43
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Но самое-то интересное - можно ли получить внутри функции значение параметра, переданного без имени?
Как я уже говорил, есть простой способ - дать имя аргументу. Код от этого не изменится ни внутри функции, ни в точке вызова функции. Различие будет только в том, что теперь к параметру можно будет обратиться.

Если же нужно обратиться к неименованному параметру без задания имени, то в общем случае ответ - "никак". В частных случаях можно. Но при этом нужно понимать, по каким правилам передаются параметры. Но код всё равно может считаться рабочим только в рамках одного компилятора. Так, например, если параметры передаются через стек, то через адрес одного параметра можно получить адрес другого параметра. Но при этом нет никакой гарантии, что параметр, который пришёл через стек, компилятор не переложил внутри функции на регистр. Разумно предположить, что с безымяным параметром так желать ни к чему (поскольку регистров мало, а тратить их на ненужный параметр - расточительство). Если изначально параметр пришёл на регистре, то очевидно, что через адрес другого параметра мы наш безымяный параметр уже не прочтём. Т.е. можно обратиться только при помощи ассемблерных конструкций напрямую к регистру. При этом точно так же у нас нет никакой гарантии, что компилятор не переиспользовал регистр по своим нуждам. Это действие уже вероятное, т.к. незачем держатьрегистр под неиспользуемую переменную, его лучше заиспользовать под полезные нужды
2
04.07.2013, 13:53

Не по теме:

кстати раз уж зашел разговор о всяческих извратах, то у меня возник вопрос, а есть ли способ в коде дать конкретному компилятору понять, что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?)

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 14:13
Цитата Сообщение от AntonChik Посмотреть сообщение
что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?
условную компиляцию никто не отменял. #ifdef в руки и вперед
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 14:16
а откуда взялось красивое число 5???
Ты, видимо, не знаешь, как работает адресная арифметика.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
04.07.2013, 14:57
Цитата Сообщение от AntonChik Посмотреть сообщение

Не по теме:

кстати раз уж зашел разговор о всяческих извратах, то у меня возник вопрос, а есть ли способ в коде дать конкретному компилятору понять, что из нескольких веток ему предстоит откомпилить лишь одну, предназначенную именно ему?)

Что конкретно ты подразумеваешь под "веткой"?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
04.07.2013, 15:38
Цитата Сообщение от Герц Посмотреть сообщение
Ты, видимо, не знаешь, как работает адресная арифметика.
Ну так просвети
повторю вопрос
C++
1
2
3
void f( int )
{ int b = 42; 
cout << *(&b+5) << endl; }
откуда взялось число 5? почему не 10 не 1?

Добавлено через 26 минут
а ну да там инт стоит
Цитата Сообщение от ValeryS Посмотреть сообщение
int b = 42;
не обратил вчера внимания
сдвиг будет на 20 байт, при int 4байта
но откуда 5?

Добавлено через 9 минут
Вот вам еще одно баловство
доступ к приватной переменной
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
class A
{
    public:
    int a;
    private:
    int b;
    public:
void fnc()
 {std::cout<<b<<std::endl;};
    
};
 
int main()
{
    A c;
    *(&c.a+1)=5;
    c.fnc();
    return 0;
}
http://ideone.com/CBdvRO
правда кому и зачем может понадобится я не знаю
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 15:52
В том конкретном коде смещение в 20 байт взялось нипочему, так уж на платформе, на которой этот код выдал ожидаемый результат, осуществляется передача аргументов при вызове функций.
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента. Пробовал от -512 байт до 512.

Про нарушение спецификаторов доступа, в этом нет ничего особенного, если понимать внутренний layout объектов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class One {
    int a;
    int b;
    int c;
};
 
struct Another {
    int a;
    int b;
    int c;
}
 
One clsInstance;
Another& asStruct = *reinterpret_cast<Another*>(&One);
asStruct.a = asStruct.b = asStruct.c = 0;
Спецификаторы доступа нужна для программистов, а кто нарушает их такими методами - сам себе злобный буратино.
P.S. при наличии в классе виртуальных функций такой подход в лоб не пройдет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 16:02
Цитата Сообщение от Герц Посмотреть сообщение
я не нашел такого смещения
так ищется оно просто:
C++
1
2
3
4
void f( char a )
{ char b = 42; 
cout << (char*)&a - (char*)&b << endl;
}
Добавлено через 1 минуту
На VS2012 x64 получилось следующее:
C++
1
2
3
4
char - 17
short - 20
int - 20
long long - 24
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
04.07.2013, 16:09
Цитата Сообщение от Герц Посмотреть сообщение
На Mac OS X, например, я не нашел такого смещения, которое дало бы адрес неименованного аргумента.
а утверждал что от "железа" это не зависит
Вполне может быть что аргументы идут через регистр и со стека ты их не достанешь
да и локальные переменные могут в регистре лежать

Цитата Сообщение от Герц Посмотреть сообщение
Спецификаторы доступа нужна для программистов, а кто нарушает их такими методами - сам себе злобный буратино.
А я говорил что нужно всем всегда делать?
единственно что могу предположить, это если пользуешь чужой класс
но завтра реализация класса изменится и программа летит
Все эти адресные арифметики штука очень "острая"
при неправильном использовании легко можно "порезаться"

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
char b
стоп стоп
вчера ты писал
C++
1
int b
а это несколько другое
C++
1
2
int b=23;
*(&b+1)
и
C++
1
2
char  b=23;
*(&b+1)
дадут как бы разные адреса
не находишь?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.07.2013, 16:14
Цитата Сообщение от ValeryS Посмотреть сообщение
дадут как бы разные адреса
в сообщении #36 речь идет о байтах, а не о кол-ве элементов.
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
04.07.2013, 16:41
а утверждал что от "железа" это не зависит
В моем маке железо такое же, как в настольном компе. Core i7 3-его поколения и прочая. Разница именно в платформе и в компиляторе.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
04.07.2013, 17:15
Это:
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int fnc1()
{
 int a=90;
 return a;
}
int fnc2()
{
 int b;
 return b;
}
.........
fnc1();
int s=fnc2();
исходник вируса "бомж", который тупо роется в мусоре.

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
как я по указателю размер массива вычислял.
Вполне валидная операция языка --z, только выглядит совсем не так, как аналогичного назначения безобразие на c++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.07.2013, 17:15

Непонятный аргумент функции
Кто-нибудь может подсказать, что принимает такая функция в качестве аргумента? void foo(int (**i)(double)) { ..... }

Передача функции в аргумент
Есть три функции: void MainMenu(); void MainMenu_MilkMenu(); bool ErrorMenu(void (*pf)()); Все прототипы находятся в...

Класс как аргумент функции
Доброго времени суток:) Набрёл на такой пример в openGL и не могу понять как он робит, подскажите. Вот описание ф-ции: void...

Не правильно передаю аргумент функции
Как такое возможно? printf(&quot;V0=%d\n&quot;,vectorSize(&amp;vector)); vectorPop(&amp;vector,i); void vectorPop(const Vector *v,...

Локальные переменные в функции и её аргумент
Привет! Пишу функцию перевода десятичного числа в текст (не обсуждайте зачем и правильно ли я делаю) Суть такова, начало функции: ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru