void f()
signifie que f
ne retourne rien. Si void
ne renvoie rien, pourquoi l'utilisons-nous? Quel est le but principal de void
?
Lorsque C a été inventé, la convention était la suivante: si vous ne spécifiez pas le type de retour, le compilateur déduit automatiquement que vous souhaitez renvoyer une int
(et la même chose pour les paramètres).
Mais souvent, vous écrivez des fonctions qui font des choses et n’ont besoin de rien retourner (pensez par exemple à une fonction qui n’imprime que quelque chose sur l’écran); Pour cette raison, il a été décidé que, pour spécifier que vous ne souhaitiez rien renvoyer, vous devez utiliser le mot clé void
en tant que "type de retour".
Gardez à l'esprit que void
sert également à d'autres fins; en particulier:
si vous le spécifiez comme liste de paramètres pour une fonction, cela signifie que la fonction ne prend aucun paramètre; cela était nécessaire en C, car une déclaration de fonction sans paramètres signifiait au compilateur que la liste des paramètres était simplement laissée non spécifiée. En C++, cela n'est plus nécessaire, car une liste de paramètres vide signifie qu'aucun paramètre n'est autorisé pour la fonction;
void
joue également un rôle important dans les pointeurs; void *
(et ses variations) signifie "pointeur sur un élément non spécifié". Ceci est utile si vous devez écrire des fonctions qui doivent stocker/passer des pointeurs sans les utiliser réellement (uniquement à la fin, pour utiliser le pointeur, un transtypage vers le type approprié est nécessaire).
de plus, un transtypage en (void)
est souvent utilisé pour marquer une valeur comme étant délibérément inutilisée, en supprimant les avertissements du compilateur.
int somefunction(int a, int b, int c)
{
(void)c; // c is reserved for future usage, kill the "unused parameter" warning
return a+b;
}
Cette question a à voir avec l'histoire du langage: C++ emprunté à C, et C utilisé pour taper implicitement tout ce qui n'est pas typé comme int
(il s'est avéré que c'était une idée horrible). Cela incluait les fonctions destinées à être des procédures (rappelons que la différence entre les fonctions et les procédures réside dans le fait que les invocations de fonctions sont des expressions, tandis que les invocations de procédures sont des instructions). Si je me souviens bien de la lecture des premiers livres de C, les programmeurs corrigeaient cette lacune avec un #define
:
#define void int
Cette convention a ensuite été adoptée dans la norme C et le mot clé void
a été introduit pour désigner les fonctions destinées à être des procédures. Cela a été très utile, car le compilateur pouvait maintenant vérifier si votre code utilise une valeur de retour provenant d'une fonction qui ne devait rien renvoyer, et vous avertir des fonctions qui doivent être retournées, mais laisser le contrôle s'exécuter à la place.
void () signifie ne rien renvoyer.
void
ne signifie pas rien . void
est un type to représente rien. C'est une différence subtile: la représentation est toujours requise, même si elle ne représente rien.
Ce type est utilisé comme fonction de la fonction return type qui ne retourne rien. Ceci est également utilisé pour représenter des données génériques, quand elles sont utilisées comme void*
. Cela semble donc amusant que, bien que void
représente rien , void*
représente tout !
Dans les langages de programmation impératifs tels que C, C++, Java, etc., les fonctions et méthodes de type void
sont utilisées pour leurs effets secondaires. Ils ne produisent pas de valeur significative à renvoyer, mais ils influencent l'état du programme de plusieurs manières possibles. Par exemple, la fonction exit
en C ne renvoie aucune valeur, mais elle a pour effet secondaire d'abandonner l'application. Autre exemple, une classe C++ peut avoir une méthode void qui modifie la valeur de ses variables d'instance.
Parce que parfois vous n'avez pas besoin d'une valeur de retour. C'est pourquoi nous l'utilisons.
Parce que considérons certaines situations où vous pouvez avoir à faire des calculs sur des variables globales et à mettre des résultats dans variable globale ou à imprimer quelque chose en fonction d’arguments, etc. Dans ces situations, vous pouvez utiliser la méthode qui ne renvoie pas de valeur. vide
Voici un exemple de fonction:
struct SVeryBigStruct
{
// a lot of data here
};
SVeryBigStruct foo()
{
SVeryBigStruct bar;
// calculate something here
return bar;
}
Et maintenant, voici une autre fonction:
void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar
{
bar.member1 = ...
bar.member2 = ...
}
La deuxième fonction est plus rapide, il n’est pas nécessaire de copier toute la structure.
Si vous n'aviez pas void
, comment diriez-vous au compilateur qu'une fonction ne renvoie pas de valeur?
Les fonctions ne sont pas nécessaires pour renvoyer une valeur. Pour indiquer au compilateur qu'une fonction ne renvoie pas de valeur, un type de retour void est utilisé.
probablement pour dire au compilateur "vous n'avez pas besoin de pousser et de faire apparaître tous les registres de processeurs!"
Parfois, il peut être utilisé pour imprimer quelque chose plutôt que pour le renvoyer. Voir http://en.wikipedia.org/wiki/Mutator_method#C_example pour des exemples.