С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/75: Рейтинг темы: голосов - 75, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.07.2016
Сообщений: 7

В чем разница между функциями возвращающими и не возвращающими значения

09.08.2016, 08:57. Показов 15824. Ответов 22
Метки нет (Все метки)

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

Пример 1.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void faktorial(int numb)// заголовок функции
{
    int rezult = 1; // инициализируем переменную rezult значением 1
    for (int i = 1; i <= numb; i++) // цикл вычисления значения n!
        rezult *= i; // накапливаем произведение в переменной rezult 
    cout << numb << "! = " << rezult << endl; // печать значения n!
}
 
int main(int argc, char* argv[])
{
    int digit; // переменная для хранения значения n!
    cout << "Enter number: ";
    cin >> digit;
    faktorial(digit);// запуск функции нахождения факториала
    system("pause");
    return 0;
}
Пример 2.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int faktorial(int numb)// заголовок функции
{
    int rezult = 1; // инициализируем переменную rezult значением 1
    for (int i = 1; i <= numb; i++) // цикл вычисления значения n!
        rezult *= i; // накапливаем произведение в переменной rezult 
    return rezult; // передаём значение факториала в главную функцию
}
 
int main(int argc, char* argv[])
{
    int digit; // переменная для хранения значения n!
    cout << "Enter number: ";
    cin >> digit;
    cout << digit << "! = " << faktorial(digit) << endl;// запуск функции нахождения факториала
    system("pause");
    return 0;
}
И еще вопрос. В функции faktorial() есть переменная numb (в цикле), но ее значение нигде не задается. И в чем отличие между параметром функции и ее аргументом?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2016, 08:57
Ответы с готовыми решениями:

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

Работа с функциями, возвращающими значения. Передача параметров по значению
Помогите переделать задачу по ссылкам очень нужно!!!!! Даны длины a, b и c сторон некоторого треугольника. Найти медианы треугольника,...

«Работа с функциями, возвращающими значения. Передача параметров по значению»
Прошу помочь очень нужно.. Простым способом . Заранее спасибо) Ссылка на картинку с задачкой : Буду очень благодарен!

22
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
09.08.2016, 12:14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void faktorial(int numb)
{
int rezult = 1;
for (int i = 1; i <= numb; i++) 
rezult *= i; 
cout << numb << "! = " << rezult << endl; 
}
 
int main(int argc, char* argv[])
{
int digit;
cout << "Enter number: ";
cin >> digit;
faktorial(digit);// digit - это переменная numb в функции. Тут вы передаёте в функцию переменную, 
//и nubm содержит копию этой переменной
system("pause");
return 0;
}
Добавлено через 11 минут
Вот пример проще:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
int func1() // int указывает, какой тип будет возвращаться, в данном случае целое число
{
    int a = 55;
    //return ""Hello WOrld"; //я не могу так написать, потому что функция должна вернуть int, но не const char*
    return a;//тут возвращается переменная типа int - всё нормально
    
}
 
void func2()
{
    int a = 77;
    //return a; // я не могу так написать, так как func2() ничего не возвращает, в отличие от func1(), там возвращается int
}
 
int main()
{
    int n = func1(); //n принимает целое число, которое возвращает func1() - переменная a
    cout << n << endl;
//  n = func2(); //я не могу так написать, так как fun2() не возвращает переменную int
    func2();
    return 0;
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
09.08.2016, 13:17
Цитата Сообщение от lyubiteltyazha Посмотреть сообщение
В чем разница между функциями возвращающими и не возвращающими значения
В том, что вторых не бывает.
1
5 / 3 / 3
Регистрация: 02.08.2016
Сообщений: 39
09.08.2016, 14:16
Первая функция не возвращает никакого значения, потому что она его уже вывела (cout).
Во второй же функции вывода значения нету, поэтому его нужна вернуть (return).
Другими же словами, смотри:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int sum(int a, int b);
 
int main()
{
    int a = sum(5, 4);
        return 0;
}
 
int sum(int a, int b)
{
    return a + b;
}
Здесь возвращается сумма переменных a и b, но если записать так, то return не нужен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
void sum(int a, int b);
 
int main()
{
    sum(5, 4);
    return 0;
}
 
void sum(int a, int b)
{
    cout << a + b;
}
0
 Аватар для spymonk
3 / 3 / 0
Регистрация: 08.06.2016
Сообщений: 39
09.08.2016, 15:29
В основном, отличается использованием ключевого слова return.
Возвращающая без него вернет значение.
Невозвращающая возвращает значение с помощью return
0
 Аватар для HedgehogLu
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
09.08.2016, 15:43
По мне так самая главная разница между данными функциями (которая возвращает значение и которая не возвращает) в том, что вторую (которая не возвращает значения) нельзя использовать в выражениях. Если проводить аналоги с другими языками программирования то функция которая не возвращает значения это процедура. Отсюда немного различная алгоритмика их использования.
1
0 / 0 / 0
Регистрация: 15.07.2016
Сообщений: 7
09.08.2016, 15:55  [ТС]
Т.е. насколько я понял, в тех функциях, которые НЕ возвращают никаких результатов, эти результаты нигде не остаются физически, ни в памяти, ни на экране. Допустим просто посчитала сумму и тут же забыла (если не выводить с помощью cout). А если мы применяем return, то результаты выполнения функции можно использовать где-то в другом месте программы. Ну то есть я хотел сказать, что если мы используем ф-ю, которая возвращает значение, но не пишем оператор cout, то значение ф-ции никуда не пропадает. Или я неправильно рассуждаю?
0
 Аватар для HedgehogLu
147 / 82 / 10
Регистрация: 04.09.2013
Сообщений: 261
09.08.2016, 16:41
Основная мысль верна. Но не стоит забывать также про параметры.
Т.к. параметры могут передаются не только по значению но и ссылками с указателями . В таких случаях изменения которые были сделаны над значением параметра (ссылка) или данными на которые параметр указывает (указатель) сохраняются.
0
 Аватар для SerVal
37 / 36 / 9
Регистрация: 16.04.2015
Сообщений: 283
09.08.2016, 17:43
Цитата Сообщение от lyubiteltyazha Посмотреть сообщение
е. насколько я понял, в тех функциях, которые НЕ возвращают никаких результатов, эти результаты нигде не остаются физически
Не правильно.

Вот функция, которая не возвращает результата:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void myFunc(int &a, int &b, int &c)
{
    a = 1; b = 1; c = 1;
}
 
int main(int argc, char *argv[])
{
    int a = 0;
    int b = 0;
    int c = 0;
    myFunc(a, b, c);
 
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c  << std::endl;
}
Результат:
C++
1
2
3
a = 1
b = 1
c = 1
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.08.2016, 21:05
Цитата Сообщение от HedgehogLu Посмотреть сообщение
вторую (которая не возвращает значения) нельзя использовать в выражениях.
Если вспомнить что такое "выражение" (expression) в С++, то оказывается, что можно Не придирка - просто уточнение.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
09.08.2016, 22:22
Цитата Сообщение от _Ivana Посмотреть сообщение
В том, что вторых не бывает.
вам стоит подучить с++
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
10.08.2016, 00:38
hoggy, приведете пример?
0
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
10.08.2016, 02:19
значение не возвращается :
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <intrin.h>
 
inline void func() {
    void* _idt;
    __sidt(&_idt);// для х64 от ms
//.....
}
 
int main(int argc, char *argv[])
{
    func();
        setlocale(LC_ALL, "");
        return 0;
}
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
8: 
     9: inline void func() {
00007FF708D91530 48 83 EC 18                     sub         rsp,18h  
    10:     void* _idt;
    11:     __sidt(&_idt);
00007FF708D91534 0F 01 0C 24                     sidt        tbyte ptr [rsp]  
    12: }
00007FF708D91538 48 83 C4 18                     add         rsp,18h  
00007FF708D9153C C3                                  ret  
 
15: int main(int argc, char *argv[])
    16: {
00007FF708D913E0 48 89 54 24 10                   mov         qword ptr [rsp+10h],rdx  
00007FF708D913E5 89 4C 24 08                       mov         dword ptr [rsp+8],ecx  
00007FF708D913E9 48 81 EC A8 00 00 00          sub         rsp,0A8h  
00007FF708D913F0 48 C7 44 24 40 FE FF FF FF  mov         qword ptr [rsp+40h],0FFFFFFFFFFFFFFFEh  
    17:     func();
00007FF708D913F9 E8 EF 04 FE FF                   call        func (07FF708D718EDh)  
    18:     setlocale(LC_ALL, "");
00007FF708D913FE 48 8D 15 9C D0 02 00          lea         rdx,[qt_meta_data_QServerPipe+521h (07FF708DBE4A1h)]  
00007FF708D91405 33 C9                                xor         ecx,ecx  
00007FF708D91407 FF 15 03 AF 04 00               call        qword ptr [__imp_setlocale (07FF708DDC310h)]  
.......
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
10.08.2016, 06:10
Попытался "подучить С++" - не смог Ну не верить же тому что пишут в учебниках, в самом деле Поэтому выбираю оставить свои заблуждения - значение из функции возвращается всегда, я могу прочитать его тип через typeid, а что не могу его скастить, передать и использовать в выражениях - кост особенности выбранной в С++ семантики типа void...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
10.08.2016, 08:59
Цитата Сообщение от _Ivana Посмотреть сообщение
а что не могу его скастить, передать и использовать в выражениях
Да почему ж нельзя в выражениях-то использовать? Откуда вы взяли это вообще?
Может для кого-то будет сюрпризом, но вот этот код - корректный код на С++:
C++
1
2
3
4
5
6
7
void foo() {  /*...*/  }
void bar() {  /*...*/  }
 
void test(bool f) 
{
    return f ? foo() : bar();
}
И вот это корректный код:
C++
1
int v = (foo(), bar(), 42);
И вот это:
C++
1
using T = decltype(foo());
И вот это:
C++
1
static_cast<void>(foo());
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
10.08.2016, 09:15
Цитата Сообщение от DrOffset Посмотреть сообщение
Если вспомнить что такое "выражение"
где можно подробно об этом почитать?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
10.08.2016, 09:18
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
где можно подробно об этом почитать?
В стандарте C++.
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
10.08.2016, 09:19
Цитата Сообщение от lyubiteltyazha Посмотреть сообщение
Есть два вида, которые возвращают значение и которые не возвращают.
Вообще-то их три вида. Возврат значения через указатель:
C++
1
2
3
4
5
6
7
void faktorial(int & numb)// заголовок функции
{
    int rezult = 1; // инициализируем переменную rezult значением 1
    for (int i = 1; i <= numb; i++) // цикл вычисления значения n!
        rezult *= i; // накапливаем произведение в переменной rezult 
    numb = result;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.08.2016, 10:00
Цитата Сообщение от lyubiteltyazha Посмотреть сообщение
И в чем отличие между параметром функции и ее аргументом?
Ну, по стандарту параметр - это объект или ссылка, объявленный в списке параметров объявления или определения функции, а аргумент - это выражение, стоящее в списке аргументов при вызове функции.
А вот авторы учебников считают по-разному. Страуструп называет параметры формальными аргументами.
Для Праты что аргументы, что параметры - все едино, он считает, что это одно и то же.
Липпман предпочитает стандарта придерживаться.
0
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
10.08.2016, 10:59
А есть еще no-return функции:
C++
1
2
3
4
5
[[noreturn]]
void foo()
{
   //...
}
Для этого монстра не то что возврат значения, даже возврат управления - UB
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2016, 10:59
Помогаю со студенческими работами здесь

Работа с функциями, возвращающими значения. Передача параметров по значению
Здравствуйте.Помогите пожалуйста я составил программу а через ссылки не могу.вот условие: Даны отрезки a, b, c и d. Для каждой тройки...

Работа с функциями, возвращающими значения. Передача параметров по значению
Помогите переделать задачу по ссылкам Даны длины a, b и c сторон некоторого треугольника. Найти медианы треугольника, сторонами...

В чем разница между функциями strcat() и strcpy()?
В чем разница между функциями strcat() и strcpy()?

В чем разница между функциями, прототипы которых имеют вид?
int *fp(int,float); int fp(int *,float);

В чем разница между дружественными функциями и дружественными методами?
Ребята в чем разница когда пишут в книги дружественные функции и дружественные методы, разве это не одно и то же?!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru