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

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

  • автор:

Тип 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 operator

Оператор void вычисляет переданное выражение и возвращает undefined .

Синтаксис

void expression

Описание

Этот оператор позволяет вставлять выражения, которые производят дополнительные действия, в места, где ожидается undefined .

Оператор void часто используется для получения примитивного значения undefined , используя «void(0)» (что эквивалентно «void 0» ). В подобных случаях можно просто использовать глобальную переменную undefined (предполагая, что её значение по умолчанию не было изменено).

Самовызывающаяся функция (IIFE)

С оператором void можно использовать самовызывающиеся функции.

void (function iife()  var bar = function () >; var baz = function () >; var foo = function ()  bar(); baz(); >; var biz = function () >; foo(); biz(); >)(); 

JavaScript URIs

Когда браузер переходит по javascript: URI , он вычисляет код в URI и заменяет содержание страницы возвращённым значением, если оно не равно undefined . Можно воспользоваться оператором void для возврата undefined . Например:

a href="javascript:void(0);">Click here to do nothinga> a href="javascript:void(document.body.style.backgroundColor='green');"> Click here for green background a> 

Однако заметим, что не рекомендуется использовать псевдо-протокол javascript: . Лучше прибегнуть к другим альтернативам, таким, как обработчики событий.

Спецификации

Specification
ECMAScript Language Specification
# sec-void-operator

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

TypeScript: Тип Void

В этом уроке мы рассмотрим тип void . Он указывается как возврат для функций, которые ничего не возвращают.

Использование типа Void

void автоматически выводится, когда внутри функции нет инструкции return или она пустая:

function noop() < // внутри пусто >

В JavaScript подобные функции возвращают undefined , но в TypeScript void и undefined — это разные вещи. Они различаются по контекстной типизации. А происходит это из-за особенностей работы самого JavaScript. Самый яркий пример — метод forEach() .

Метод forEach() не использует данные, возвращаемые переданным колбеком, который вызывается внутри. Возможно, логично было бы определить возврат как undefined , но посмотрим на пример:

const numbers = [1, 2, 3]; const result = []; numbers.forEach((n) => result.push(n)); 

Метод push() возвращает новую длину массива. Если бы forEach() требовал от колбека возврат undefined , то такой код привел бы к ошибке компиляции. Его пришлось бы переписать, например, так:

// Теперь колбек ничего не возвращает, // соответственно, результат вызова undefined numbers.forEach((n) => < result.push(n); >); 

Чтобы не писать такой код, и был введен void . Он позволяет возвращать любые данные, но делает так, что их использование бессмысленно.

Мы можем определить тип функции, который возвращает void , и использовать его для типизации переменной:

type VoidFunc = () => void; // Тип функции определяется через контекст // присваивания ее переменной с типом VoidFunc const f: VoidFunc = () => true; const v = f(); 

Хотя f() возвращает true , переменная v имеет тип void . Это означает, что мы не можем использовать ее для чего-либо, кроме как для присваивания другой переменной с типом void .

Существует единственная ситуация, когда указание void явно запрещает возврат из функции. Это определение функции вне контекста использования, когда ее тип указывается явно:

function foo(): void < return true; // Error! >const bar = function(): void < return true; // Error! >; 

В этом случае возврат любого значения приведет к ошибке компиляции.

Также void является оператором JavaScript, поэтому важно не запутаться с ним. Он вычисляет выражение, которое следует за ним и возвращает undefined :

void 10 === undefined // true 

Задание

Попробуйте самостоятельно определить функцию forEach() для чисел:

forEach([1, 2, 3], (n) => console.log(n)); // 1 // 2 // 3 const result = []; forEach([1, 2, 3], (n) => result.push(n)); // [1, 2, 3] 
  1. Массив чисел
  2. Анонимная функция, которая принимает на вход число и возвращает void . У этой функции есть необязательный параметр — индекс элемента в массиве
forEach([8, 9], (n, index) => console.log(index + n)); // 8 // 10 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

  • Официальная документация
  • void в TypeScript и JavaScript

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

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

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

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

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

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

18413 / 9584 / 2341
Регистрация: 30.01.2014
Сообщений: 16,742

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

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

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

Эксперт С++

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

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

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

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

5277 / 2364 / 342
Регистрация: 20.02.2013
Сообщений: 5,763
Записей в блоге: 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 не будет опубликован. Обязательные поля помечены *