Quale di queste risposte riguardo alle funzioni non è corretta?


17

Quindi, mentre ho fatto alcune lunghe compilazioni, ho deciso di fare il test generale C ++ su ODesk e ho trovato questa domanda.

Questa domanda

Se non sbaglio, data la formulazione (o la mancanza di ciò), tutto ciò potrebbe essere vero.

un.

int Foo() { }
int Foo(int bar) { }

b. Bene, return void;sarebbe semanticamente errato ma le funzioni possono ovviamente avere voidtipi di ritorno.

void Foo() { }

c. Questa è la definizione di funzioni incorporate, sì.

d. Senza entrare nei dettagli sul posizionamento dei seguenti elementi,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Inoltre, puoi sempre farlo usando lambda e funzioni .

e.

void Foo(int& bar)
{
    ++bar;
}

int foobar = 5;
Foo(foobar);

f.

int bar = 5;

int& GetBar()
{
    return bar;
}

GetBar() = 6;

g.

int bar = 5;

int* GetBar()
{
    return &bar;
}

(*GetBar()) = 5;

Non riesco a vedere dove questa domanda abbia delle risposte veramente false . Mi sto perdendo qualcosa?

Inutile dire che ho finito il tempo e ho fallito tutto. Immagino di essere un cattivo programmatore C ++. :(


18
È venuto qui per gridare a qualche bambino che incollava i compiti, è stato piacevolmente sorpreso.
SomeKittens,

In realtà non tutte le lingue richiedono l'espansione delle funzioni in linea. "inline" è un suggerimento del compilatore piuttosto che un comando in Delphi e C, C ++ hanno eccezioni . Quindi anche "c" può essere falso. Potrebbe essere più divertente scrivere una risposta che mostri come ogni affermazione possa essere sbagliata.
Móż,

1
@ Ӎσᶎ Se solo ci fosse una casella di testo. Voglio tornare indietro e toccare il "Segnala un problema con questa domanda".
Qix,

5
Questa non è una matrice di funzioni. Questa è una matrice di puntatori a funzioni.
user253751,

@immibis Vero, ma la domanda non chiarisce davvero (almeno per me no).
Qix,

Risposte:


21

Tutta questa domanda è complicata. L'affermazione della domanda implica la possibilità di scelte multiple, mentre i pulsanti di opzione indicano una singola scelta.

Inoltre, b è piuttosto sospetto, poiché le funzioni di annullamento non restituiscono nulla.

D è anche discutibile, per quanto ne so, non puoi avere una serie di funzioni. Certo, puoi avere una serie di puntatori a funzioni, ma non è esattamente la stessa cosa.


Giusto; D è come chiedere se puoi chiamare un int. Certo, se lo lanci su un puntatore e quel puntatore si riferisce a una funzione ...
Qix,

1
Sono disposto a scommettere che D è la risposta che stanno cercando, ma sì, la domanda è scarsa.
Gort il robot il

Mentre le voidfunzioni non restituiscono alcun valore , restituiscono comunque il tipo void . Quindi dico che B è vero.
Thomas Eding,

@ThomasEding Questa è ancora una formulazione davvero brutta da parte loro. No return void;, ma invece return;.
Qix,

10

Anche la risposta c) è probabilmente falsa.

"Le funzioni incorporate vengono espanse durante il tempo di compilazione per evitare il sovraccarico di invocazione."

Innanzitutto, al compilatore C ++ è consentito ignorare il inlinesuggerimento non espandendo affatto le funzioni.

In secondo luogo, la "ragione" dichiarata per fare l'espansione è una semplificazione eccessiva. In effetti, la vera ragione per fare l'espansione (o meno) è interamente nelle mani dello scrittore del compilatore.


Siete sulla strada giusta, ma stavo pensando a questo proposito, nel senso di 'okay, il compilatore ha determinato che non vuole inline una funzione' piuttosto che il inlinesuggerimento.
Qix,

Bene, il compilatore non può ignorare completamente il suggerimento. Almeno è effetto obbligatorio, facendo un'eccezione a ODR.
Deduplicatore,

@Deduplicator - Sì, può. "Indipendentemente da come si designa una funzione come in linea, si tratta di una richiesta che il compilatore può ignorare: il compilatore potrebbe incorporare-espandere alcuni, tutti o nessuno dei luoghi in cui si chiama una funzione designata come in linea." - fonte isocpp.org/wiki/faq/Inline-Functions
Stephen C

@StephenC: la richiesta di espansione in linea può essere ignorata, sì. Ho solo detto che l'eccezione esplicita all'ODR non può.
Deduplicatore,

Vedo. Ho aggiornato la formulazione della mia risposta
Stephen C,

7

c. Questa è la definizione di funzioni incorporate, sì.

Non è del tutto corretto.
Nonostante il suo nome, la parola chiave inlinenon garantisce che una funzione verrà incorporata. L'unica cosa di cui puoi essere sicuro è che il compilatore non si lamenterà se vede più volte la definizione di una funzione inline.

Quindi, a rigor di termini, l'opzione C non è corretta, ma non credo sia la risposta che gli autori del quiz si aspettano, perché esiste una risposta ancora più sbagliata.

d. Senza entrare nei dettagli sul posizionamento dei seguenti elementi,

typedef void (*Func)(int);

Func functions[2];

void Foo(int bar) { }
void Bar(int foo) { }

functions[0] = &Foo;
functions[1] = &Bar;

Inoltre, puoi sempre farlo usando lambda e funzioni.

Nel tuo esempio, functionsè una matrice di puntatori a funzioni e non una matrice di funzioni stesse. Allo stesso modo, lambda e funzioni non sono nemmeno funzioni. Sono classi che rispondono all'operatore di chiamata di funzione, ma ciò non le rende funzionali agli occhi della definizione del linguaggio C ++.

Le funzioni in C ++ sono un po 'come i cittadini di seconda classe. Puoi definirli e chiamarli, ma non appena provi a fare qualcos'altro con un tipo di funzione (come crearne uno array), ricevi un errore o si convertono silenziosamente in un puntatore.


Sono d'accordo con il bit D, ma stavo leggendo ccome funzioni che sono già state contrassegnate positivamente per l'inline, rispetto alla inlineparola chiave stessa. Capisco inlineè un suggerimento.
Qix,

4

Semmai, dovrebbe essere b . Non è possibile returnuna void, ma si può restituire un null. Annullare la dichiarazione della funzione dovrebbe essere presente per notificare al compilatore la mancanza di un valore restituito.

Tipo di vuoto

In C e C ++

Una funzione con tipo di risultato nullo termina raggiungendo la fine della funzione o eseguendo un'istruzione return senza valore restituito. Il tipo vuoto può anche apparire come unico argomento di un prototipo di funzione per indicare che la funzione non accetta argomenti. Si noti che nonostante il nome, in tutte queste situazioni, il tipo di vuoto funge da tipo di unità, non come tipo zero o inferiore, anche se a differenza di un tipo di unità reale che è un singleton, si dice che il tipo di vuoto comprenda un vuoto insieme di valori e la lingua non fornisce alcun modo per dichiarare un oggetto o rappresentare un valore con tipo vuoto.


2
-1: mentre le voidfunzioni non restituiscono alcun valore , restituiscono comunque il tipo void . Quindi dico che B è vero.
Thomas Eding,

La restituzione del vuoto è consentita in alcune circostanze. Vedi qui .
Josh Kelley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.