165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
|
||||||
1 | ||||||
В чем разница между типом функции и типом возвращаемого значения?19.08.2015, 08:48. Показов 3969. Ответов 39
Метки нет (Все метки)
Читаю статью
https:// code-live. ru/post/cpp-functions/ (ссылку изменил дабы не делать рекламу) Там написано - Любая функция имеет тип, также, как и любая переменная. - Функция может возвращать значение, тип которого в большинстве случаев аналогично типу самой функции. Пример -----------------------------
Я этот код вижу так тип_возвращаемого_значения имя_функции (тип_аргумента аргумент_функции) { тело_функции возвращаемое_значение_согласно_типу_возвращаемого_значения } Что такое тип функции (он тут есть?), в чем разница между типом функции и типом возвращаемого значения и как тип функции и тип возвращаемого значения могут различаться?
0
|
19.08.2015, 08:48 | |
Ответы с готовыми решениями:
39
Нужно сделать чтобы можно было управлять типом возвращаемого значения функции Сложности с типом возвращаемого значения Серийного номера Почему ковариантный тип может быть только типом возвращаемого значения метода? Нужно переменной с типом real присвоить выражение a1 mod 2, где a1 - это переменная с типом integer. |
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
|
|
19.08.2015, 13:03 [ТС] | 21 |
Тип не может быть правилом. Мы о каком типе говорим? Возможно, под типом вы подразумеваете что-то другое?
Основные типы в С++ делятся на три категории: целочисленные, с плавающей запятой и void. int это правило? string это правило? Предположим, что тип функции определяет как компилятор будет располагать переменные в стеке перед вызовом процедуры......... Но вы не ответили на вопрос где в коде тип функции и где тип возвращаемого значения? Мне не нужно знать, кто и что определяет, располагает и т.д. Я не прошу вас это рассказать. Мне нужно 2 слова. Смотрите int a=5; //Слово int, тип данных int. Я понимаю. Вижу ключевое слово, обозначающее тип данных. string check_pass (string password) // Вижу ключевое слово string. Что оно обозначает? Тип функции или тип возвращаемого значения? Вы понимаете, я уже час пытаюсь сказать - что должно быть 2 ключевых слова. Одно - тип функции, другое тип возвращаемого значения. Два слова. А тут одно. В этом весь вопрос. Я даже предположил, что это одно слово сразу определяет 2 типа (а какой вывод ещё может быть?). Но вы отвергли это предположение. Где второе слово? Откуда вы взяли что тип функции string? Как вы вычислили это? Этой информации нет в коде. Физически нет.
0
|
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
|
|
19.08.2015, 13:33 | 23 |
useruser, У функции есть только возвращаемое значение и сигнатура в которую входит имя функции и его аргументы, больше там ничего нету (исключение - методы класса где добавляются некоторые другие особенности).
0
|
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
|
|||||||||||
19.08.2015, 13:36 [ТС] | 24 | ||||||||||
Я внимательно читаю и не по одному разу. Стараюсь понять и сделать выводы. Но ответа на свой вопрос не получаю.
Хорошо, попробую по другому. Многие языки программирования схожи. В основном. Код делфи.
function needs result type. Обратимся к официальной справке разработчика. You have declared a function, but have not specified a return type. Что означает - Вы объявили функцию, но не указали тип возвращаемого значения. Вывод - Int64 тип возвращаемого значения. Где тип функции? Подозреваю, что его нет. В с++ синтаксис другой, но количество операторов тоже, только изменено их расположение
Может нет никакого типа функции, а есть только тип возвращаемого значения? Добавлено через 33 секунды Выше утверждают что есть. Ищу уже 3 часа. Не могу понять где.
0
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
|||||||||||
19.08.2015, 14:09 | 25 | ||||||||||
А как же массивы, указатели, классы, структуры, объединения, ссылки?
Он как суслик, ты его не видишь, но он есть. Тут функция имеет тип Int64(AnsiString). как правильно записать это в delphi не знаю, но функциональные типы там то же есть Функцию можно рассматривать как черный ящик, в который кладешь набор объектов, они как-то обрабатываются, и получается другой объект - возвращаемое значение. Например sin - принимает double, возвращает double. Тип функции double(double). Тип Возвращаемого значения double. cos - аналогично. Тип функции double(double), возвращаемое значение - double. т.е. у функций sin и cos один и тот же и тип функций, и тип возвращаемого значения. у функции с прототипом
тип возвращаемого значения такой же как у sin и cos, но тип функции уже другой.
1
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
19.08.2015, 14:19 | 26 |
Int64 (AnsiString)
Ну если на С++. double Sum(short a, const int b) - функция. double - тип возвращаемого значения. (short, const int) - аргументы. double(short, const int) - тип функции. Sum, a, b - переменные (в первой храниться функция заданного выше типа, в остальных аргументы). Вместо одной функции можно безболезненно подставить другую функцию такого же типа.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|||||||||||||||||||||
19.08.2015, 14:24 | 27 | ||||||||||||||||||||
Давай по пунктам.
1) Ты пишешь функцию:
int - это тип возвращаемого значения функции string - тип аргумента функции. Здесь понятно? 2) Теперь переходим к типу функции. Вот есть запись:
Т.е. задав функцию, ты сразу же задаешь и ее тип, как head-n-shoulders, в одном флаконе. Явно тип функции записывается так (задается псевдоним типа через typedef):
_____ Еще раз для закрепления: объявление функции неявно в себе содержит тип этой функции.
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
19.08.2015, 14:24 | 28 | ||||||||||
есть указатель на функцию
есть ссылка на указатель, через который нельзя менять объект аргумент - указатель на функцию итого: везде указатели. ессна, это будет работать.
0
|
19.08.2015, 14:54 | 29 | |||||||||||||||
hoggy, опять лукавите. Ни один даже стандартный тип не кастует указатель на себя в ссылку:
Однако:
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
19.08.2015, 19:00 | 30 |
вот именно!
а из этого проистекает, что функция и указатель на функцию - это не одно и тоже. зато любой кастует себя к ссылке на себя. что и иллюстрируют мои примеры выше. свободные функции подобно массивам умеют неявно каститься к указателям, просто int - это и не функция, и не массив. и он такое не умеет.
0
|
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
|
|
20.08.2015, 06:49 [ТС] | 31 |
Основные. Не я эту фразу придумал.
Теперь ясно. А какой это тип данных Int64(AnsiString)? Int64 - целочисленный AnsiString - строковый Int64(AnsiString)?
0
|
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
|
|
20.08.2015, 07:26 | 32 |
0
|
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
|
|
20.08.2015, 09:04 [ТС] | 33 |
Ясно.
И какая цель этого типа? Проще говоря зачем этот "параметр" нужен функции? О чем он говорит? int a; //Выделяем память размером 4 байт. Int64(AnsiString) - ? Функция это набор команд, фрагмент программного кода. Зачем фрагменту кода тип?
0
|
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
|
|
20.08.2015, 10:23 | 34 |
В C++ у каждого объекта есть тип. В том числе и у функций. Тип нужен для того, чтобы понять, как можно использовать объект. Тип существует только лишь в сознании программиста и в компиляторе. В самом скомпилированном коде как такового типа никакого нет.
Выше вам уже объясняли. И да, вы думаете фрагменту кода не нужна память? А где ж он тогда будет храниться? Но, по-большому счёту, тип данных определяет только лишь операции, которые к нему применимы. К числам применимы одни операции, к функциям другие. Типы и занимаемая память не связаны непосредственно. Вообще, тип — это просто некая абстракция. Нет, определяем целочисленную переменную. Это основной смысл. Если бы вы хотели просто выделить память, то, возможно, лучший способ сделать это — написать char a[4];
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
|
20.08.2015, 11:23 | 35 |
Тип это множество принимаемых значений (1, 2, 3, 'a', 'b'...) и множество операций (плюс, минус, больше, меньше). Тип функции определяет множество значений (операции и так понятны - вызвать) т.е. какие именно функции из всего многообразия подходят под конкретную ситуацию. Для того чтобы вызвать функцию нужно знать ее аргументы и возвращаемый тип, название же можно менять, ошибок это не вызовет. Вообще это нужно для того чтобы сначала объявить тип функции, а потом по ситуации подставить одну из.
0
|
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
|
|
20.08.2015, 12:05 [ТС] | 36 |
Из всего выше прочитанного у меня сложилось впечатление, что тип функции - "несуществующая" абстракция.
Мы его нигде не задаем и нигде не используем. Он получается из типа аргумента и типа возвращаемого значения. "Побочный продукт." Нам он не нужен. Более того, мы не можем описать его подобно основным типам с++ (категория, размер типа) в силу бесконечности вариантов. А вот тип аргумента и тип возвращаемого значения - мы задаем. Мы не можем его преобразовать, наподобие inttostr(my_int). Мы ничего не можем с ним сделать. Делать что либо мы можем только с типом аргумента и возвращаемого значения. И это, возможно, повлияет на тип функции. Ситуация очень похожа на известную поговорку - ветер дует, потому что деревья качаются или деревья качаются т.к. ветер дует... Все вышеописанное ИМХО т.к. во всех учебниках есть функциональный тип. Можно пример?
0
|
99 / 46 / 18
Регистрация: 09.08.2015
Сообщений: 367
|
||||||
20.08.2015, 12:22 | 37 | |||||
Ага.
Не факт, но бывает. В C++ можем описать указатель на функцию. Можем, но это не имеет смысла. С типом? А что мы можем сделать с типом int? Конкретную функцию конкретного типа можно вызвать.
0
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
|
20.08.2015, 12:58 | 38 |
А кто?
Выше я приводил пример использования Функциональное программирование Несколько человек привели примеры где функциональный тип используется. Вот пример использования из стандартной библиотеке: qsort
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
20.08.2015, 14:29 | 39 |
0
|
20.08.2015, 14:48 | 40 |
Любые типы - "несуществующие абстракции". В Ассемблере никаких типов нет, только биты и несколько операций с ними. Так что никакие типы вообще не нужны
ЗЫ я тоже когда столкнулся с функциональными языками и типизированным лямбда-исчислением, долго в себя приходил Сейчас читаю TAPL и не могу сказать, что легко идет.
0
|
20.08.2015, 14:48 | |
20.08.2015, 14:48 | |
Помогаю со студенческими работами здесь
40
Преобразовать массив с типом char в массив с типом int Передача значения с типом DateTime в метод В чем смысл создания шаблона с заранее известным передаваемым типом Нужно перевести переменную с типом данных string в переменную с типом данных REAL Перевод значения переменной с типом string в time Присвоение значения полю с логическим типом в отчёте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |