Pomoc w zrozumieniu funkcji Void

0

Witam, niedawno zacząłem się uczyć o funkcjach i zagadką jest dla mnie furkacja Void, na czym one polegają, nie będę podawał konkretnego przykładu, ale żeby było wiadomo, o co mi chodzi to, napisze początek takiej funkcji.

#include <iostream>
using namespace std;
void Test
4

void to typ oznaczający pustkę/nicość. Chodzi o to, że dana funkcja jest de-facto procedurą, a nie funkcją w rozumieniu matematyczno-podobnym, czyli nie zwraca żadnej wartości.

0

Dzięki za pomoc :) ale właśnie to mi nie za bardzo coś mówi .Może jakiś przykład różnicy Void a inną funkcją w praktyce.

0

Po prostu funkcja void w momenie swojego wywołania wykonuje kod który jest w jej definicji, a nie zwraca wartość:

void Test(){
cout << "Hello from void:)";
}
//....
//....
Test(); // -> Hello from void:)
0

A czyli różnica take że nie wprowadza się danych , funkcja wykonuje tylko to co ma w sobie , to chyba rozumiem :) jeżeli nie popraw mnie :D

0

w dużym, ogromnym uproszczeniu

jak masz funkcję void, to nie będziesz miał w funkcji return - taka funkcja niczego nie zwraca

jak jest jakiś inny typ funkcji, np int to gdzieś tam w kodzie znaleźć się będzie musiało wyrażenie return coś_tam gdzie coś_tam to jakaś zmienna/cokolwiek innego co ma typ int, czyli jest liczbą

ewentualnie czasem domyślnie zwracane jest zero z tego co pamiętam, ale mogę się mylić

ale poza tym, na twoim poziomie, to możesz bezpiecznie założyć, że nie różnią się niczym więcej - wszystko to samo, też możesz wprwoadzać dane itd.

0
falszywyemail napisał(a):

A czyli różnica take że nie wprowadza się danych , funkcja wykonuje tylko to co ma w sobie , to chyba rozumiem :) jeżeli nie popraw mnie :D

O co chodzi z wprowadzaniem danych?

0

Właśnie pisałem odpowiedz i znów się pogubiłem bo np :

double kwadrat(double x)

wpisuje dane czyli x a myślałem że w void tego nie ma a zobaczyłem przykład

void zamien(double& a, double& b)

tu też się podaje dane + referencja jest czy coś ale nie wiem czy ma to jakieś znaczenie w tym temacie . więc znowu się pogubiłem :P . Myślałem ze void wygląda tylko tak

void Test(){
cout << "Hello from void:)";

tu danych się nie podaje

1
falszywyemail napisał(a):

Właśnie pisałem odpowiedz i znów się pogubiłem bo np : [ double kwadrat(double x) ] wpisuje dane czyli x a myślałem że w void tego nie ma a zobaczyłem przykład [ void zamien(double& a, double& b) ] tu też się podaje dane + referencja jest czy coś ale nie wiem czy ma to jakieś znaczenie w tym temacie . więc znowu się pogubiłem :P . Myślałem ze void wygląda tylko tak [ void Test(){
cout << "Hello from void:)"; ] tu danych się nie podaje

Masz na myśli parametry formalne funkcji, jak void f() - bez parametrów czy void g(int x) z jednym parametrem. To nie ma znaczenia, jak program się wykonuje to "widząc" wywołanie funkcji typu void, wykonuje to co w jej definicji (tak jak przy każdej innej funkcji :)), jak ma ona jakieś parametry formalne to wykonuje odpowiednie przypisania na stosie, i tak dalej; z tą różnicą, że ten kawałek programu nic nie zwraca, coś tam się dzieje i kontynuujemy do kolejnej komendy. W przypadku funkcji która zwraca jakiś obiekt, możemy ją przypisać do zmiennej, czy cokolwiek:

int inc(int x){
x += 1;
return x;}
//...
//....
x = 0;
int a = inc(x);
cout <<  a ; // 1

W przypadku funkcji void zrobić się tak nie da.

2

@falszywyemail: dane możesz sobie wprowadzać w dowolnej funkcji. Z void chodzi o to, że taka funkcja nie może zwrócić danych za pomocą return x, gdzie x to jakaś wartość (literał lub identyfikator).

0

W rozumieniu quasi-matematycznym, funkcja ma parametry (wejścia) i wartość (dla danych argumentów). Np. sin(x), czyli

double sin(double x)
{
    return /* ... */;
} 

Wartość takiej funkcji możesz np. wypisać:

std::cout << sin(PI/4);

Z drugiej strony masz procedurę, np. podnieś ramię robota o x cm.

void robot_raise_arm(int cm)
{
    // ...
}

W tym przypadku ciężko mówić o wartości takiej funkcji, bo jest to po prostu wywołanie procedury.

W wielu językach programowania, w tym C++, różnica między czysto matematycznymi funkcjami bez efektów ubocznych i procedurami jest zatarta lub nie istnieje w ogóle, więc traktuj te przybliżenia jako uproszczenia, a nie pełne i wyczerpujące definicje.

0

Po namyśle, doszedłem do wniosku z waszych komentarzy, że void niczego nie zwraca, czyli referencje typu dodawanie liczb itd... nie mogą być jako void, ale na przykład referencje, które zamieniają istniejące liczby pasuje do void i np.: referencje, które wykorzystują istniejące liczby / informacje, ale nie tworzą nowych też mogą być void ?

za dożo tych void w tym zdaniu ;p

na tym przykładzie

void zamien(double& a, double& b)
{
    double tymczasowa(a);      
    a = b;                   
    b = tymczasowa;            

]
0

Pomyśl w taki sposób, że metoda jest jak maszynka do mielenia mięsa.
Coś wkładasz i coś innego wychodzi.

Tak samo w programowaniu: wkładasz jakieś argumenty do metody/funkcji, a ta funkcja mieli te argumenty i wychodzi przemielony produkt.

Metoda void nie zwraca żadnego typu. Mieli mięcho i napycha je do kiszek, ale nic nie zwraca.

Stosuj void jak najrzadziej.

1

@NeutrinoSpinZero: mowa o funkcjach, nie metodach – nie mieszajmy pytaczowi w głowie na chwilę obecną zbędnymi terminami.

3

Też miałem kiedyś problem ze zrozumieniem tej różnicy między funkcjami a procedurami, więc spróbuję napisać, jak w końcu to zrozumiałem.

Zarówno procedura jak i funkcja mogą przyjmować różne parametry w nagłówku, więc tym się nie sugeruj. W obu też możemy tworzyć zmienne (lokalne, niedostępne poza klamrami). Różnica jest taka, że jak już napisano, funkcja zwraca wartość (czyli na końcu ma "return cośtam", gdzie "cośtam" musi być typu takiego, jak funkcja, np int). Procedura nie zwraca wartości, a jedynie wykonuje różne rzeczy. Procedury i funkcje różnia się zarówno w budowie, jak i w tym, jak je wywołujesz. W praktyce to wyobraź sobie procedurę i funkcję, które sumują 2 liczby.

Różnica w budowie:

void proceduraSumuj(int a, int b)
{
    cout << "Suma wynosi " << a + b;
}
int funkcjaSumuj(int a, int b)
{
    return a + b;
}

Różnica w wywołaniu:
procedurę void możesz sobie od tak napisać w kodzie:

int main()
{
    proceduraSumuj(2,2); // wyswietli "Suma wynosi 4";
    return 0;
}

Natomiast gdybyś tak samo wywołał tę funkcję, to w praktyce tak, jakbyś napisał:

int main()
{
    4;
    return 0;
}

Czyli bez sensu, nie?

Dlatego funkcje przypisujesz do zmiennej albo wrzucasz do couta:

int main()
{
    int mojaSuma;
    mojaSuma = funkcjaSumuj(2,2);
    
    // albo, jeśli byś chciał uzyskać efekt jak przy procedurze:
    cout << "Suma wynosi: " << funkcjaSumuj(2,2);
    return 0;
}
1

Jeśli chodzi o C++, to raczej nie używa się terminu procedura – w tym języku (i wszystkich podobnych składniowo) są po prostu funkcje, zwracające dane w typowym rezultacie, lub nie zwracające w nim danych. Owy void istnieje po to, aby móc tworzyć funkcje nie zwracające danych za pomocą return i aby ujednolicić składnię deklaracji funkcji – nagłówków i ciał. Gdyby voida nie było, to trzeba by inaczej zapisywać nagłówki funkcji zwracających dane w rezultacie, i inaczej tych, które tego nie robią.

// funkcja zwracająca liczbę
int foo(int a, int b)

// funkcja nie zwracajaca danych poprzez return
foo(int a, int b)  // ?

Jawne procedury natomiast istnieją w innych językach, np. w Pascalu. Składnia jasno określa co jest funkcją, a co procedurą – nagłówek zaczyna się od słówka procedure, albo od function. W funkcji zwraca się dane za pomocą Result, który to nie jest w ogóle dostępny w procedurach. W późniejszych wersjach dialektów (np. Free Pascalu) zunifikowano zapis, dając możliwość wyjścia z procedury za pomocą Exit, a z funkcji za pomocą Exit(wartość).

1

@furious programming: void nie jest potrzebny w C. Nawet deklarowanie typu wyniku. Taki "smaczek".

#include <stdio.h>
 
 main()
 {    
      int x = 3;
      printf("Square of %d = %d\n", x, square(x));
 }
 
 square(x)
 {    
      int y = 3 * 3;
      return y;
 }

https://ideone.com/JLU7cG

0 użytkowników online, w tym zalogowanych: 0, gości: 0