2012-05-21 13 views
5

Sono molto nuovo alla programmazione e sono confuso su ciò che il vuoto fa, so che quando si mette il vuoto di fronte a una funzione significa che "non restituisce nulla" ma se la funzione non restituisce nulla, allora qual è il punto di scrittura del funzione?? Ad ogni modo, ho questa domanda sui miei compiti e sto cercando di rispondere ma ho bisogno di aiuto con il concetto generale. qualsiasi aiuto sarebbe grande, e per favore cerca di evitare il gergo tecnico, sono un newb serio qui.confusione sul vuoto e sul suo significato.

Cosa compie questa funzione?

void add2numbers(double a, double b) 
    { 
     double sum; 
     sum = a + b; 
    } 
+4

Ci sono molte cose da fare per una funzione, oltre a restituire qualcosa ... –

+4

Ti manca il concetto di [_side effects_] (http://en.wikipedia.org/wiki/Side_effect_ (computer_science)). – ildjarn

+0

Quella funzione non fa nulla, e molto probabilmente verrà rimossa quando compilato –

risposta

3

Lo scopo di una funzione void è quello di realizzare un effetto collaterale (ad esempio, modificare un parametro di riferimento o una variabile globale, effettuare chiamate di sistema come I/O, ecc), non restituisce un valore.

8
void ReturnsNothing() 
{ 
    cout << "Hello!"; 
} 

Come si può vedere, questa funzione rendimenti nulla, ma questo non significa che la funzione fa nulla.

Una funzione è nient'altro che un refactoring del codice per mettere insieme le routine di uso comune. Se stampo "Ciao" spesso, inserisco il codice che stampa "Ciao" in una funzione. Se sto calcolando la somma di due numeri, inserirò il codice per farlo e restituirò il risultato in una funzione. È tutto su ciò che vuoi.

+2

Conosco persone che lavorano con Visual Basic (non VB.NET), e in VB c'è differenza tra funzione e sotto. A chi si sviluppa in vb sub è come una funzione che non restituisce nulla e quando restituisce qualcosa è una funzione. Forse confonde alcune persone che iniziano ad imparare C++ e lingue simili. –

1

Una funzione con valore di ritorno vuoto può essere utile per i suoi effetti collaterali. Per esempio si consideri la funzione libreria standard exit:

void exit(int status) 

Questa funzione non restituisce alcun valore per voi, ma è comunque utile per il suo effetto collaterale di terminare il processo.

1

Tale funzione ottiene nulla - ma se avesse scritto

void add2numbers(double a, double b, double &sum) 
{   
    sum = a + b; 
} 

Sarebbe darvi la somma, se è più facile per restituire un valore o utilizzare un parametro dipende dalla funzione

In genere si farebbe usa un parametro se ci sono più risultati, ma supponi di avere una routine matematica in cui una risposta potrebbe non essere possibile.

bool sqrt(double value, double &answer) 
{ 
    if value < 0.0) { 
     return false; 
    } else { 
     answer = real_sqrt_function(value); 
     return true; 
    } 
} 
5

Ci sono un sacco di motivi per avere funzioni vuote, alcuni di questi stanno avendo effetti collaterali 'non puri':

int i=9; 
void f() { 
    ++i; 
} 

In questo caso i potrebbe essere globale o un membro della classe di dati.

L'altro è effetti osservabili

void f() { 
    std::cout <<"hello world" << std::endl; 
} 

Una funzione vuoto può agire su un valore di riferimento o puntatore.

void f(int& i) { 
    ++i; 
} 

Potrebbe anche lanciare, anche se non farlo per il controllo di flusso.

void f() { 
    while(is_not_broke()) { 
     //... 
    } 
    throw std::exception(); //it broke 
} 
1

Sei sulla strada giusta - la funzione non compie nulla, perché calcola qualcosa, ma quel qualcosa poi viene gettato via.

Le funzioni di restituzione void possono essere utili perché possono avere "effetti collaterali". Ciò significa che succede qualcosa che non è un input o un output della funzione. Ad esempio, potrebbe scrivere su un file o inviare un'e-mail.

2

L'uso del termine funzione nel contesto di C/C++ è piuttosto confuso, perché non è d'accordo con il concetto matematico di una funzione come "qualcosa che restituisce un valore". Che chiamate di C/C++ le funzioni che restituiscono il vuoto corrisponde al concetto di una procedura in altre lingue.

La principale differenza tra una funzione e una procedura è che una chiamata di funzione è espressione, durante una chiamata procedura sia dichiarazione Mentre le funzioni vengono richiamate per il loro valore di ritorno, le procedure vengono richiamate per i loro effetti collaterali (ad esempio produzione di output, modifica dello stato e così via).

1

La funzione è un po 'un errore in questo caso; forse chiamarlo un metodo è meglio. Puoi chiamare un metodo su un oggetto per cambiare il suo stato, cioè i valori dei suoi campi (o proprietà). Quindi potresti avere un oggetto con le proprietà appropriate per le coordinate xey e un metodo chiamato Move che prende i parametri xDelta e yDelta.

Chiamando Move con 2, 3 verrà aggiunto 2 alla proprietà X e 3 verrà aggiunto alla proprietà Y. Quindi lo stato dell'oggetto è cambiato e non avrebbe avuto senso per Ming per avere restituito un valore.

0

Attualmente utilizzo una libreria di visualizzazione denominata VTK. Normalmente scrivo le funzioni void per aggiornare alcune parti della grafica che vengono visualizzate sullo schermo. Uso anche le funzioni void per gestire l'interazione della GUI in Qt. Ad esempio, se si fa clic su un pulsante, alcuni testi vengono aggiornati sulla GUI.

0

Hai perfettamente ragione: calcolare una funzione che restituisce nulla non ha senso, se parli di funzioni matematiche. Ma come in molti concetti matematici, le "funzioni" sono in molti linguaggi di programmazione solo relative alle funzioni matematiche, ma si comportano in modo più o meno sottilmente differente.

Credo sia opportuno spiegarlo con una lingua che fa non sbagliare: una di queste lingue è Haskell. È un linguaggio puramente funzionale, il che significa che una funzione Haskell è anche una funzione matematica. In effetti, è possibile scrivere le funzioni di Haskell in modo molto più matematico, ad es.

my_tan(x) = sin(x)/cos(x)   -- or (preferred): tan' x = sin x/cos x 

che in C++

double my_tan(double x) { return sin(x)/cos(x); } 

Tuttavia, per i programmi informatici non si vuole solo per calcolare funzioni, vero? Volete anche fare delle cose, come visualizzare qualcosa sullo schermo, inviare dati attraverso la rete, leggere valori dai sensori, ecc. In Haskell, cose come queste sono ben separate dalle funzioni pure, agiscono tutte nel cosiddetto IO monad. Ad esempio, la funzione putStrLn, che stampa una riga di caratteri, ha tipo String -> IO().Significato, prende un argomento come String e restituisce un'azione IO che stampa quella stringa quando viene richiamata dalla funzione main e nient'altro (i paren () sono approssimativamente ciò che è void in C++).

Questo modo di fare IO ha molti vantaggi, ma la maggior parte dei linguaggi di programmazione sono più scrupoloso: permettono tutte funzioni di fare IO, e anche per cambiare lo stato interno del programma. Quindi, in C++, potresti semplicemente avere una funzione void putStrLn(std::string), che "restituisce" anche un'azione IO che stampa la stringa e nient'altro, ma non lo dice esplicitamente. Il vantaggio è che non hai bisogno di legare più nodi nel tuo cervello quando pensi a quello che è effettivamente il monade IO (è piuttosto rotonda). Inoltre, molti algoritmi possono essere implementati per funzionare più velocemente se si ha la capacità di dire effettivamente alla macchina "fai questa sequenza di processi, ora!" piuttosto che chiedere il risultato di qualche computazione nella monade IO.

Problemi correlati