La page à laquelle vous avez accédé donne déjà la réponse à la première partie :
Si une taille de tableau explicite est spécifiée, mais qu'une liste d'initialisation est spécifiée, le éléments non spécifiés sont mis à zéro.
Il n'existe pas de moyen intégré pour initialiser le tableau entier à une valeur non nulle.
Quant à savoir lequel est le plus rapide, la règle habituelle s'applique : "La méthode qui donne le plus de liberté au compilateur est probablement plus rapide".
int array[100] = {0};
indique simplement au compilateur "mettre ces 100 ints à zéro", ce que le compilateur peut optimiser librement.
for (int i = 0; i < 100; ++i){
array[i] = 0;
}
est beaucoup plus spécifique. Elle indique au compilateur de créer une variable d'itération i
il lui dit que commander dans lequel les éléments doivent être initialisés, et ainsi de suite. Bien sûr, le compilateur est susceptible d'optimiser tout cela, mais le fait est qu'ici vous surspécifiez le problème, forçant le compilateur à travailler plus dur pour arriver au même résultat.
Enfin, si vous souhaitez définir le tableau à une valeur non nulle, vous devez (en C++, du moins) utiliser la commande std::fill
:
std::fill(array, array+100, 42); // sets every value in the array to 42
Encore une fois, vous pourriez faire la même chose avec un tableau, mais cette méthode est plus concise et donne plus de liberté au compilateur. Vous dites simplement que vous voulez que le tableau entier soit rempli avec la valeur 42. Vous ne dites rien sur l'ordre dans lequel cela doit être fait, ni rien d'autre.
1 votes
Le comportement en C et C++ est différent. En C, {0} est un cas spécial pour un initialisateur de structure, mais pas pour les tableaux. int array[100]={0} devrait être identique à array[100]={[0]=0}, ce qui a pour effet secondaire de mettre à zéro tous les autres éléments. Un compilateur C ne devrait PAS se comporter comme vous le décrivez ci-dessus, au contraire int array[100]={-1} devrait mettre le premier élément à -1 et le reste à 0 (sans bruit). En C, si vous avez une struct x array[100], utiliser ={0} comme initialisateur n'est PAS valable. Vous pouvez utiliser {{0}} qui initialisera le premier élément et mettra à zéro tous les autres, ce qui dans la plupart des cas sera la même chose.
1 votes
@FredrikWidlund C'est la même chose dans les deux langues.
{0}
n'est pas un cas particulier pour les structs ou les arrays. La règle est que les éléments sans initialisateur sont initialisés comme s'ils avaient0
pour un initialisateur. S'il existe des agrégats imbriqués (par ex.struct x array[100]
) alors les initialisateurs sont appliqués aux non-agrégats dans l'ordre "row-major" ; les accolades peuvent éventuellement être omises pour ce faire.struct x array[100] = { 0 }
est valide en C ; et valide en C++ tant que le premier membre destruct X
accepte0
comme initialisateur.1 votes
{ 0 }
n'est pas spéciale en C, mais il est beaucoup plus difficile de définir un type de données qui ne peut pas être initialisé avec elle puisqu'il n'y a pas de constructeurs et donc aucun moyen d'arrêter0
d'être implicitement converti et affecté à quelque chose .3 votes
J'ai voté pour la réouverture parce que l'autre question concerne le C. Il y a de nombreuses façons en C++ d'initialiser un tableau qui ne sont pas valables en C.
1 votes
A également voté pour la réouverture - C et C++ sont des langages différents.
0 votes
J'ai supprimé la balise C puisque cette question est clairement axée sur le C++ et j'ai modifié le titre de la question en conséquence. La question peut maintenant être rouverte car elle n'est plus un doublon de la question C illustrée. Pour tous ceux d'entre vous qui rencontreront cette question à l'avenir et qui voudraient jeter un coup d'œil à la même question pour le C, voici le lien : Comment initialiser tous les membres d'un tableau à la même valeur ? ?