Если void () не возвращает значение, почему мы его используем?
void f()
означает, что f
ничего не возвращает. Если void
ничего не возвращает, тогда почему мы его используем? Какова основная цель void
?
11 ответов
когда был изобретен C, соглашение заключалось в том, что, если вы не указали тип возврата, компилятор автоматически сделал вывод, что вы хотите вернуть int
(и то же самое для параметров).
но часто вы пишете функции, которые делают вещи и не должны ничего возвращать (подумайте, например, о функции, которая просто печатает что-то на экране); по этой причине было решено, что, чтобы указать, что вы не хотите ничего возвращать вообще, вы должны использовать void
ключевое слово как "тип возврата".
имейте в виду, что void
служит и другим целям; в частности:
если вы укажете его как список параметров для функций, это означает, что функция не принимает параметров; это было необходимо в C, потому что объявление функции без параметров означало для компилятора, что список параметров просто не указан. В C++ это больше не нужно, так как пустой список параметров означает, что нет параметр разрешен для функции;
void
также играет важную роль в указатели;void *
(и его вариации) означает "указатель на что-то осталось неуточненным". Это полезно, если вам нужно написать функции, которые должны хранить / передавать указатели, фактически не используя их (только в конце, чтобы фактически использовать указатель, требуется приведение к соответствующему типу).-
кроме того, приведение к
(void)
часто используется для обозначения стоимости в намеренно неиспользуемые, подавляющие предупреждения компилятора.int somefunction(int a, int b, int c) { (void)c; // c is reserved for future usage, kill the "unused parameter" warning return a+b; }
этот вопрос имеет отношение к истории языка: C++ заимствован из C, и C используется для неявного ввода всего нетипизированного как int
(как оказалось, это была ужасная идея). Это включало функции, которые предназначались как процедуры (напомним, что разница между функциями и процедурами заключается в том, что вызовы функций являются выражениями, а вызовы процедур-операторами). Если я правильно помню это из чтения ранних книг C, программисты использовали для исправления этого недостаток с #define
:
#define void int
эта конвенция позже была принята в стандарте C, и void
ключевое слово было введено для обозначения функций, которые предназначены как процедуры. Это было очень полезно, потому что компилятор теперь мог проверить, использует ли ваш код возвращаемое значение из функции, которая не предназначалась для возврата чего-либо, и предупредить вас о функциях, которые должны вернуться, но вместо этого пусть элемент управления запускается с конца.
void () означает ничего не возвращать.
void
не значит ничего. void
Это тип to представляют ничего. Это тонкое различие:представление по-прежнему требуется, даже если он ничего не представляет.
этой тип используется как функция тип возвращаемого которая ничего не возвращает. Это также используется для представления общих данных, когда используется как void*
. Так что звучит забавно, что пока void
представляет ничего, void*
представляет все!
в императивных языках программирования, таких как C, С++, Java и т. д. функции и методы типа void
используются для их побочных эффектов. Они не производят значимого значения для возврата, но они влияют на состояние программы одним из многих возможных способов. Е. Г., элемент exit
функция в C не возвращает значения, но имеет побочный эффект прерывания приложения. Другой пример: класс C++ может иметь метод void, который изменяет значение переменных экземпляра.
причина рассмотрим некоторые ситуации , когда вам может потребоваться выполнить некоторые вычисления по глобальным переменным и поместить результаты в глобальную переменную или вы хотите напечатать что-то в зависимости от аргументов и т. д.. В этих ситуациях вы можете использовать метод, который не возвращает значение.. т. е.. пустота
вот пример функции:
struct SVeryBigStruct
{
// a lot of data here
};
SVeryBigStruct foo()
{
SVeryBigStruct bar;
// calculate something here
return bar;
}
и теперь вот еще одна функция:
void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar
{
bar.member1 = ...
bar.member2 = ...
}
вторая функция быстрее, ей не нужно копировать всю структуру.
иногда его можно использовать для печати чего-то, а не для его возврата. Вижу http://en.wikipedia.org/wiki/Mutator_method#C_example Примеры
функции не требуются для возврата значения. Чтобы сообщить компилятору, что функция не возвращает значение, используется возвращаемый тип void.