Что возвращает void c
Перейти к содержимому

Что возвращает void c

void

В C++ тип функции означает, какого типа будет значение, возвращаемое функцией. Но если вместо обычного типа перед именем функции стоит спецификатор void, то с ним общее правило не работает. Это спецификатор означает, что у функции нет возвращаемого значения. Как следствие, оператор return, отвечающий за возвращаемое значение, убирается. Рассмотрим пример:

void kvad1 ( int a , int & b )
int kvad2 ( int a )
return a * a ;

Обе функции выполняют возведение в квадрат числа, но функция kvad1 принимает b и изменяет его, а kvad2 с помощью оператора return вернет значение в конструкцию вызова данной функции, значение которой присвоят отдельной переменной.

Спецификатор void выполняет и другие функции. Например, в случае декларатора функции, если void стоит на месте параметров функции, это означает, что функция не имеет параметров, при этом имея прототип.

Возвращаемые значения

Все функции, кроме функций типа void, возвращают значения. Данное значение определяется в операторе return. Если функция не определена как void и если не указано возвращаемое значение, то возвращается мусор. Если функция не объявлена как void, она может использоваться в качестве операнда в любом корректном выражении. Следовательно, каждое из следующих выражений корректно:

if (max (х, у) > 100) printf («greater»);

for (ch=getchar(); isdigit(ch); ) . ;

Тем не менее функция не может стоять с левой стороны оператора присваивания. Оператор типа

swap (х, у) = 100; /* некорректный оператор */

неправилен. Компилятор выдаст ошибку.

Если функция объявляется как void, она не может использоваться в выражениях. Например, предположим, что f() объявлена как void. Следующие операторы не будут компилироваться:

int t;
t = f(); /* нет значения для присваивания t */
f() + f(); /* нет значений для сложения */

Хотя все функции не типа void имеют значения возврата, при написании программ обычно используется три типа функций. Первый тип — это вычислительные функции. Он предназначен для выполнения операций с аргументами и возвращает значение, основываясь на этих операциях. Примером таких функций являются sqr() и sin() — стандартные библиотечные функции.

Следующий тип функций обрабатывает информацию и возвращает значение, показывающее, была ли работа успешной или привела к ошибке. Примером является fwrite() — функция, используемая для записи информации в файл. Если запись проведена успешно, fwrite() возвращает число удачно записанных элементов. Если возникла ошибка, возвращаемое число не равно числу элементов, которые требовалось записать.

Последний тип функций не имеет определенного возвращаемого значения. Функция является обычной процедурой и не выдает значения. Примером служит srand(), используемая для инициализации генератора случайных чисел функции rand(). Иногда функции, не выдающие осмысленного результата, что-то все-таки выдают. Например, printf() возвращает число напечатанных символов. Очень трудно найти программу, которая проверяет это. Следовательно, хотя все функции, кроме функций, объявленных как void, возвращают значения, нет необходимости использовать все эти значения. Типичным вопросом по возвращаемым функциями значениям является: «Не должен ли я присвоить данное значение некоторой переменной, поскольку значение возвращается?» Ответ: «Нет». Если не указано, чему присваивается возвращаемое значение, то оно просто отбрасывается. Рассмотрим следующую программу, использующую mul():

int mul(int a, int b);

int main(void)
int x, y, z;
x = 10; у = 20;
z = mul(x, у); /* 1 */
printf («%d», mul(x, y) ); /* 2 */
mul (x, y); /* 3 */
return 0;
>

int mul (int a, int b)
return a*b;
>

Строка 1 присваивает возвращаемое функцией mul() значение переменной z. В строке 2 возвращаемое значение напрямую не используется, но оно используется косвенно функцией printf(). Наконец, в строке 3 возвращаемое значение теряется, поскольку не происходит присваивание значения какой-либо переменной и также оно не используется ни в каком из выражений.

Тип void*

В языках C и C++ есть специальный тип данных void * . Это — «универсальный» указатель, который просто соответствует указателю на какой-либо адрес в памяти компьютера, безотносительно типа данных, на которые указывает этот указатель. То есть указатель типа void * нельзя разыменовать, так как разыменование — это доступ к переменной, которая хранится по адресу данного указателя.

Указатель типа void * используется для передачи параметром в функции и для возврата функциями значений, если функции работают с областями памяти, просто как с двоичными данными.

Примеры таких функций

Заголовочный файл

void *memset(void *s, int c, size_t n) — заполнить область памяти, на которую указывает s одинаковым значением байта c. Заполняется n байт памяти.

void *memcpy(void *dest, const void *src, size_t n) — скопировать n байт памяти из области памяти src в область памяти dst. Копируемые данные и область назначения данных не должны пересекаться.

void *memcpy(void *dest, const void *src, size_t n) — аналогично memcpy, но допускает пересечение областей, в этом случае для копирования используются вспомогательная память. Эта функция работает медленнее, чем memcpy.

Заголовочный файл

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) — из файла steam считываются данные блоками размером size, количество считываемых блоков равно nmemb. Данные записываются в область памяти, на которую указывает ptr. Функция возвращает количество успешно считанных блоков (то есть если все блоки были считаны успешно, то функция возвращает nmemb).

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) — записывает двоичные данные в файл. Параметры и возвращаемое значение аналогичны функции fread.

Заголовочный файл

Функции динамического распределения памяти malloc и free, а также calloc и realloc также работают с указателями типа void * .

Тип void как возвращаемое значение функции: что он такое, зачем он нужен, где, когда и как его использовать?

Объясните пожалуйста про Void для оооочень далекого человека. Читаю книгу Шилдта, в принципе всё ясно, всё понимаю и пробую, но вот Void — дело другое. Я абсолютно не могу понять что это такое. Прочитал кучу сайтов и форумов, везде написано что эта функция, которая не возвращает значения(а что это я всё равно понять не могу, вот как лбом об стену). Хоть палкой на песке рисуй

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

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

Что такое yield return и когда его использовать?
Кто может простым языком объяснить, что есть yeild return и когда его юзать

Что такое knockout.js и как его использовать
Всем привет! помогите понять — что такое knockout.js и как его использовать в mvc. вот хорошое.

18467 / 9625 / 2355
Регистрация: 30.01.2014
Сообщений: 16,876

ЦитатаСообщение от Lucky_Nucky Посмотреть сообщение

Хоть палкой на песке рисуй

void — это тип, абстракция для понятия «ничто«. void в качестве типа возвращаемого значения функции означает, что функция возвращает «ничто», то есть ничего не возвращает.
На данном этапе это все, что необходимо об этом типе знать.

Эксперт С++

1068 / 847 / 60
Регистрация: 30.04.2011
Сообщений: 1,659

В паскале были процедуры и функции.
Причем, записывались с ключевыми словами: procedure и function.
procedure — это просто последовательность действий, которую обозвали именем.
function — это, некоторая операция, имеющая результат.
Например, функция sin — синус.

В С\С++ нет ключевых слов.
Исторически все подпрограммы обозвали функциями.
А функция — имеет результат (который возвращает с помощью return).
Если результат не нужен, а нужно просто записать последовательность действий и обозвать ее неким именем?
Тогда и пишут void — нет возвращаемого значения.

Эксперт CЭксперт С++

5279 / 2366 / 342
Регистрация: 20.02.2013
Сообщений: 5,766
Записей в блоге: 20

Лучший ответ

Сообщение было отмечено Lucky_Nucky как решение

Решение

Lucky_Nucky, представьте функцию, как некоего деятеля. Скажем, повар. Повар выполняет определённый набор действий — выполняет все инструкции (statements), находящиеся в теле функции. Тело функции — это то, что между фигурными скобками.

  1. тип возвращаемого значения
  2. название функции
  3. сигнатуру функции (количество и тип аргументов)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// функция повар принимает два аргумента - св типа Свинина и р типа Рис // тип возвращаемого значения - ПловСоСвининой ПловСоСвининой повар( Свинина св, Рис р ) { ПловСоСвининой пл; замочить( р ); нарезать( св ); варить( р, св ); пл = р + св; Специи сп; пл += сп; return пл; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// функция повар принимает два аргумента - св типа Свинина и р типа Рис // тип возвращаемого значения - void (не надо ничего возвращать - всё съест кошка) void повар( Свинина св, Рис р ) { ПловСоСвининой пл; замочить( р ); нарезать( св ); варить( р, св ); пл = р + св; Специи сп; пл += сп; Кошка к; к.съесть( пл ); }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *