Laquelle de ces réponses concernant les fonctions est incorrecte?

17

Donc, pendant que je fais de longues compilations, j'ai décidé de passer le test général C ++ sur ODesk et suis tombé sur cette question.

Cette question

Si je ne me trompe pas, étant donné le libellé (ou son absence), tout cela pourrait être vrai.

une.

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

b. Eh bien, ce return void;serait sémantique incorrectement, mais les fonctions peuvent évidemment avoir des voidtypes de retour.

void Foo() { }

c. C'est la définition des fonctions en ligne, oui.

ré. Sans entrer dans les détails du placement des éléments suivants,

typedef void (*Func)(int);

Func functions[2];

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

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

De plus, vous pouvez toujours le faire en utilisant des lambdas et des foncteurs .

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;

Je ne vois pas où cette question a des réponses vraiment fausses . Suis-je en train de manquer quelque chose?

Inutile de dire que j'ai manqué de temps et que j'ai tout échoué. Je suppose que je suis un mauvais programmeur C ++. :(

Qix
la source
18
Je suis venu ici pour crier après qu'un enfant ait fait ses devoirs, a été agréablement surpris.
SomeKittens
En fait, toutes les langues ne nécessitent pas l'extension des fonctions en ligne. "inline" est un indice du compilateur plutôt qu'une commande dans Delphi, et C, C ++ ont des exceptions . Donc "c" peut aussi être faux. Il pourrait être plus amusant d'écrire une réponse montrant comment chaque affirmation peut être erronée.
Móż
1
@ Ӎσᶎ Si seulement il y avait une zone de texte. Je veux revenir en arrière et cliquer sur "Signaler un problème avec cette question".
Qix
5
Ce n'est pas un tableau de fonctions. Il s'agit d'un tableau de pointeurs de fonction.
user253751
@immibis C'est vrai, mais la question n'est pas vraiment claire (du moins pour moi, ce n'est pas le cas).
Qix

Réponses:

21

Toute cette question est douteuse. L'énoncé de question implique la possibilité de choix multiples, tandis que les boutons radio indiquent un seul choix.

De plus, b est assez suspect, car les fonctions void ne renvoient rien.

D est également discutable, car pour autant que je sache, vous ne pouvez pas avoir un tableau de fonctions. Bien sûr, vous pouvez avoir un tableau de pointeurs de fonction, mais ce n'est pas exactement la même chose.

comment s'appelle-t-il
la source
Droite; D revient à demander si vous pouvez appeler un int. Bien sûr, si vous le transformez en un pointeur et que ce pointeur fait référence à une fonction ...
Qix
1
Je suis prêt à parier que D est la réponse qu'ils recherchent, mais oui, la question est mauvaise.
Gort le robot
Bien que les voidfonctions ne renvoient aucune valeur , elles renvoient toujours le type void . Je dis donc que B est vrai.
Thomas Eding
@ThomasEding C'est encore une très mauvaise formulation de leur part. Vous ne le faites pas return void;, mais à la place return;.
Qix
10

La réponse c) est également sans doute fausse.

"Les fonctions en ligne sont étendues pendant la compilation pour éviter la surcharge d'appel."

Premièrement, le compilateur C ++ est autorisé à ignorer le inline indication en ne développant pas du tout les fonctions.

Deuxièmement, la «raison» invoquée pour procéder à l'expansion est une simplification excessive. En fait, la vraie raison de faire l'expansion (ou non) est entièrement entre les mains du rédacteur du compilateur.

Stephen C
la source
Vous avez raison, mais je pensais dans le sens de « accord, le compilateur a déterminé qu'il ne veut inline une fonction » plutôt que l' inlineindice.
Qix
Eh bien, le compilateur ne peut pas ignorer complètement l'indice. Au moins, c'est un effet obligatoire, faisant une exception à l'ODR.
Déduplicateur
@Deduplicator - Oui, c'est possible. "Peu importe comment vous désignez une fonction en ligne, c'est une demande que le compilateur est autorisé à ignorer: le compilateur peut développer en ligne certains, tous ou aucun des endroits où vous appelez une fonction désignée comme en ligne." - source isocpp.org/wiki/faq/Inline-Functions
Stephen C
@StephenC: La demande de développement en ligne peut être ignorée, oui. J'ai seulement dit que l'exception explicite au RLL ne le pouvait pas.
Déduplicateur
Je vois. J'ai mis à jour le libellé de ma réponse
Stephen C
7

c. C'est la définition des fonctions en ligne, oui.

Ce n'est pas tout à fait vrai.
Malgré son nom, le mot inline- clé ne garantit pas qu'une fonction sera insérée. La seule chose dont vous pouvez être sûr, c'est que le compilateur ne se plaindra pas s'il voit plusieurs fois la définition d'une fonction en ligne.

Donc, à proprement parler, l'option C est incorrecte, mais je ne pense pas que ce soit la réponse que les auteurs du quiz attendent, car il y a une réponse encore plus fausse.

ré. Sans entrer dans les détails du placement des éléments suivants,

typedef void (*Func)(int);

Func functions[2];

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

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

De plus, vous pouvez toujours le faire en utilisant des lambdas et des foncteurs.

Dans votre exemple, functionsest un tableau de pointeurs vers fonctions et non un tableau de fonctions elles-mêmes. De même, les lambdas et les foncteurs ne sont pas vraiment des fonctions non plus. Ce sont des classes qui répondent à l'opérateur d'appel de fonction, mais cela n'en fait pas des fonctions aux yeux de la définition du langage C ++.

Les fonctions en C ++ sont un peu comme des citoyens de seconde classe. Vous pouvez les définir et les appeler, mais dès que vous essayez de faire autre chose avec un type de fonction (comme en créer un tableau), vous obtenez soit une erreur, soit ils se convertissent silencieusement en pointeur.

Bart van Ingen Schenau
la source
Je suis d'accord avec le bit D, mais je lisais ccomme des fonctions qui ont déjà été marquées positivement pour l'inline, par rapport au inlinemot-clé lui-même. Je comprends inlineest un indice.
Qix
4

Si quoi que ce soit, il faudrait que ce soit b . Vous ne pouvez pas returnune void, mais vous pouvez renvoyer un null. La déclaration de fonction doit être vide pour signaler au compilateur l'absence de valeur renvoyée.

Type nul

En C et C ++

Une fonction dont le type de résultat est vide se termine soit en atteignant la fin de la fonction, soit en exécutant une instruction return sans valeur renvoyée. Le type void peut également apparaître comme le seul argument d'un prototype de fonction pour indiquer que la fonction ne prend aucun argument. Notez que malgré le nom, dans toutes ces situations, le type void sert de type d'unité, pas de type zéro ou de fond, même si contrairement à un type d'unité réel qui est un singleton, le type void est censé comprendre un vide ensemble de valeurs, et le langage ne fournit aucun moyen de déclarer un objet ou de représenter une valeur de type void.

Adam Zuckerman
la source
2
-1: Bien que les voidfonctions ne renvoient aucune valeur , elles renvoient toujours le type void . Je dis donc que B est vrai.
Thomas Eding
Le retour de la nullité est autorisé dans certaines circonstances. Voyez ici .
Josh Kelley