Подтвердить что ты не робот

Если void() не возвращает значение, почему мы его используем?

void f() означает, что f ничего не возвращает. Если void ничего не возвращает, то почему мы его используем? Какова основная цель void?

4b9b3361

Ответ 1

Когда C было изобретено, соглашение заключалось в том, что если вы не указали тип возвращаемого значения, компилятор автоматически предположил, что вы хотите вернуть int (и то же самое верно для параметров).

Но часто вы пишете функции, которые делают вещи и не нуждаются в возврате ничего (подумайте, например, о функции, которая просто печатает что-то на экране); по этой причине было решено, что, чтобы указать, что вы вообще ничего не хотите возвращать, вы должны использовать ключевое слово void как "тип возврата".


Имейте в виду, что void служит и для других целей; в частности:

  • если вы укажете его как список параметров для функций, это означает, что функция не принимает никаких параметров; это было необходимо в 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;
    }
    

Ответ 2

В императивных языках программирования, таких как C, С++, Java и т.д., для их побочных эффектов используются функции и методы типа void. Они не дают значимой ценности для возвращения, но они влияют на состояние программы одним из многих возможных способов. Например, функция exit в C не возвращает значения, но имеет побочный эффект прерывания приложения. Другой пример: класс С++ может иметь метод void, который изменяет значение его переменных экземпляра.

Ответ 3

void() означает возврат ничего.

void ничего не значит. void - это тип, который ничего не представляет. Это тонкая разница: представление все еще требуется, хотя оно ничего не представляет.

Этот тип используется как возвращаемый тип функции, который ничего не возвращает. Это также используется для представления общих данных, когда оно используется как void*. Поэтому звучит забавно, что пока void ничего не представляет, void* представляет все!

Ответ 4

Этот вопрос связан с историей языка: С++, заимствованный из C, и C, используемый для неявного ввода всего нетипированного как int (как оказалось, это была ужасная идея). Это включало функции, которые были предназначены как процедуры (напомним, что разница между функциями и процедурами заключается в том, что вызовы функций являются выражениями, а вызовы процедур - это операторы). Если я правильно напомню это из чтения ранних книг C, программисты использовали этот недостаток с помощью #define:

#define void int

Это соглашение позднее было принято в стандарте C, а ключевое слово void было введено для обозначения функций, которые предназначены как процедуры. Это было очень полезно, потому что компилятор теперь может проверить, использует ли ваш код возвращаемое значение из функции, которая не была предназначена для возврата чего-либо, и чтобы предупредить вас о функциях, которые должны возвращаться, но пусть контроль запускается с самого начала.

Ответ 5

Потому что иногда вам не нужно возвращать значение. Вот почему мы его используем.

Ответ 6

Если у вас не было void, как бы вы сказали компилятору, что функция не возвращает значение?

Ответ 7

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

Ответ 8

Здесь примерная функция:

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 = ...
}

Вторая функция выполняется быстрее, ей не нужно копировать целую структуру.

Ответ 9

возможно, чтобы сообщить компилятору "вам не нужно толкать и всплывать все cpu-регистры!"