7
votes

Le tableau initialise en C ++

#include <iostream>
using namespace std;

int main() {
    int arr[10] = {};
    for(auto element : arr)
    {
        cout<<element<<" ";
    }
    cout<<endl;
}
if i write int arr[10] = {}, the elements in arr are all 0. but if i just wrtie int arr[10], the elements in arr are random.
So i am confused about int arr[10] = {}, i just declare a array int arr[10], but i don't give it any value, just a {}.

4 commentaires

Il s'agit simplement d'un sucre syntaxique, dans de nombreuses situations, vous devez créer une éventail d'entiers initialisés avec des zéros, imaginez que la taille de la matrice est 1000 à la place, de côté que Sytax Seulement le seul moyen est de boucler la matrice et d'affecter 0 à chaque élément manuellement. En savoir plus sur les tableaux ici


Maintenant que vous avez une réponse, pour les coups de pied, supprimez le = (mais gardez le {} ) et essayez-le à nouveau. int arr [10] {};


@WhozCraig Le résultat est 0 0 0 0 0 0 0 0 0 0 0 0 , le = est peut-être inutile, quelle est la raison?


Cela gâcherait le plaisir. Faites de la chasse lorsque vous avez des temps libres et recherchez des questions plus connectées C ++ sur différentes méthodes d'initialisation . Et merci de l'essayer.


3 Réponses :


7
votes

Si j'écris int Arr [10] = {}, les éléments in Arr sont tous 0.

C'est à quel point la syntaxe de la langue fonctionne. Dans votre cas, la matrice sera zéro initialisée.

mais si je viens de WRTIE INTRA [10], les éléments d'ARR sont aléatoires.

Dans vos éléments de matrice de cas ne sont pas initialisés. Vous ne devez pas lire des valeurs de variables qui ne sont pas initialisées; Sinon, vous déclencherez un comportement indéfini.


5 commentaires

En réalité, int arr [10] = {}; valeur-initialise . int arr [10]; est par défaut-initialiser ce qui signifie ne rien faire pour INT. (Voir [DCL.Init / 7])


Ne fonctionne-t-il que pour le type de base (int, flotteur, double)? Si je définis une classe personnalisée personne , est-ce que personne arr [10] = {} fonctionne?


@Blackmamba Dans ce cas, l'instance de votre objet sera initialisée par défaut - quel que soit le moyen d'initialisation par défaut pour votre classe, AFaik.


@Giorgi Pour être plus précis, ils seront également valeur initialisée . Cela peut faire une différence dans certains cas.


@Blackmamba si personne a un constructeur, puis par défaut-initialiser signifie appeler ce constructeur pour initialiser une personne



2
votes

Selon le site Web de référence du CPP ( http://en.cppreference.com/w/ C / Langue / Array_initialisation ) Voici comment initialiser tous les éléments de réseau à zéro:

int a a [3] = {}; // Validité C ++ valide C ++ à zéro un tableau de saut de bloc-nœud


0 commentaires

0
votes

int arr [10]; N'intriguez rien, il s'agit d'allouer des blocs de mémoire la taille d'un int et que vous obtenez ce qui est dans cette mémoire.

int arr [10] = {}; Initialisation de tous les blocs int à NULL / 0


4 commentaires

Cela est vrai pour les types de construction tels que INT, mais la différence entre défaut et valeur initialisée pour les types avec des constructeurs est plus complexe.


@Martinbonner Mais il utilise un tableau Int dans l'exemple et demandant pourquoi il obtient toutes les données 0 ou aléatoires. Est-ce que je manque quelque chose? Je reçois ce que vous dites mais ne pensez pas que cela s'applique à la question. objet arr [10] = {} il suffit d'utiliser le constructeur par défaut de ces objets?


S'il y a un constructeur par défaut, objet arr [10] = {}; et objet arr [10]; l'appellera tous les deux. Si c'est un type de pod, chaque objet sera initialisé à zéro dans le premier cas et à gauche indéterminé dans le second cas.


initialiser int blocs à NULL?