1

Одни начинают функции с int, другие с void. Чем вот этот вариант ... :

int increaser(int* x) //используем указатель
{

 (*x)++;
 //return (*x);

};

... отличается от этого ? :

void increaser(int* x) //используем указатель
{

 (*x)++;
 //return (*x);

};

Слышала (из курса от Специалиста), что void используют при программировании драйверов.

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Tanya
  • 1,021
  • 2
    Первый вариант, по-хорошему, не должен бы компилироваться: сказано, что функция возвращает целое число, но ни одного return при этом в теле нет. main же случай особый, но его полная сигнатура по-хорошему включает возврат int (код выхода) и приём массива строк (аргументов командной строки) в виде числа элементов и указателя на нулевой из них. Но из-за исторически сложившегося разброда инструменты могут стерпеть и ряд других записей. –  Apr 02 '18 at 20:54
  • Первый вариант не будет компилироваться. – Эникейщик Apr 02 '18 at 20:55
  • void функции в Си соответствуют подпрограммам (исторически они появились до функций) в других языках. Попробуйте почитать в вике (по ссылкам). По сути разница в том, что основным назначением функции (по крайней мере к этому стоит стремиться) является возврат чистого результата, а подпрограммы -- побочные эффекты – avp Apr 02 '18 at 22:06
  • void-функция не возвращает значение. Вот и всё. Например, они могут что то изменять по ссылке, или отображать что то пользователю. С драйверами это вообще никак не связано. – kisssko Apr 02 '18 at 23:35
  • @D-side возврат значения из функции может быть и другими средствами, отличными от return, быть обеспечен, поэтому здесь всего лишь предупреждение, а не ошибка. – αλεχολυτ Apr 03 '18 at 04:31
  • 1
    @Эникейщик будет. – αλεχολυτ Apr 03 '18 at 04:32
  • @alexolut портируемо или через "контролируемый UB"/особенности платформы? :) –  Apr 03 '18 at 08:22
  • @D-side платформозависимо. По стандарту С++ завершение функции, возвращающей что-то отличное от void - это UB. Но здесь C и действуют немного другие правила. – αλεχολυτ Apr 03 '18 at 14:30

3 Answers3

2

Первая функция, обязательно требует чтобы из нее был произведен возврат данных типа int, любой иной тип или вообще игнорирования возврата значение, вызовет ошибку.

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

Tanya
  • 1,021
  • 1
    При попытке возврата не будет никакой ошибки. Оператор return является принудительным завершением процедуры – Ladence Apr 02 '18 at 20:51
  • Не учел это, Благодарю. – Евгений Иванов Apr 02 '18 at 20:52
  • Игнорирование возврата для функции с возвращаемым значением не вызовет ошибку (если конечно не включить обработку предупреждений как ошибок). – MSDN.WhiteKnight Apr 03 '18 at 05:13
1

Первая функция возвращает значения типа int (32битное целое) с которым можно в дальнейшем работать, вторая функция ничего не возвращает (слышал как некоторые в шутку называют тип void пустышкой)

Ladence
  • 664
  • 4
  • 16
  • С Си не соскучишься.... Если void пустышка, то зачем в книгах проскальзывают примеры с main функцией с использованием void ? – Tanya Apr 02 '18 at 20:48
  • 2
    @Tanya разнотипные функции main используются исключительно линкером для установки entry point с ОС. – Ladence Apr 02 '18 at 20:50
  • @Tanya по поводу main есть вопрос/ответ. – αλεχολυτ Apr 03 '18 at 04:25
1

Вот пример:

int incr1(int *p)
{
    ++(*p);
    return *p;
}
void incr2(int* p)
{
    ++(*p);
}

int main()
{   
    int m[] = {1,2, 3};
    m[0]  += incr1(m); // выражение справа возвращает целое  m[0] которое равен 2
    //тогда прибавив  к m[0]  еще и это значение, получим m[0] == 4
    cout << m[0] <<endl;
    // а другой функцией можем только инкремент осуществлять
    incr2(m);
    // и не можем это присвоить чему то
    // просто наращиваем m[0] еще на  единицу
    cout << m[0]; // 5
    return 0;
}
AR Hovsepyan
  • 15,934