214 votes

Comment déclarer et définir plusieurs variables dans une ligne en C++ ?

J'ai toujours pensé que si je déclare ces trois variables, elles auront toutes la valeur 0.

int column, row, index = 0;

Mais je constate que seul l'indice est égal à zéro et que les autres sont des déchets comme 844553 et 2423445.

Comment puis-je initialiser toutes ces variables à zéro sans déclarer chaque variable sur une nouvelle ligne ?

43 votes

Attention à ces déclarations multi-variables d'une ligne. Il est plus facile que vous ne le pensez de déclarer un pointeur int suivi d'une liste d'entiers réguliers ( int* a, b, c; ne fait pas ce qu'il semble faire).

4 votes

Il n'y a que trois variables, mec, écris =0 pour chacun d'eux dans leurs définitions. Et, si vous voulez vraiment de nombreuses variables, essayez un tableau : int a[10]={0} initialisera chaque a[i] à 0 pour vous.

0 votes

Le compilateur ne devrait pas autoriser cette construction si elle doit se comporter différemment de ce qu'un programmeur raisonnable attendrait d'elle...imho

258voto

Josh Points 1919
int column = 0, row = 0, index = 0;

0 votes

Bonjour, je me demande si cette expression supporte tous les types de données comme std::vector<float> etc. ou seulement le type de données primaire.

202voto

Matt Points 8168

Quand vous déclarez :

int column, row, index = 0;

Seul l'indice est mis à zéro.

Cependant, vous pouvez faire ce qui suit :

int column, row, index;
column = index = row = 0;

Mais personnellement, je préfère la suivante qui a été signalée.
C'est une forme plus lisible à mon avis.

int column = 0, row = 0, index = 0;

ou

int column = 0;
int row = 0;
int index = 0;

3 votes

Entre les deux dernières, je décide si les deux valeurs doivent vraiment être du même type ( bool previousInputValue, presentInputValue; ) ou s'ils sont simplement du même type maintenant mais n'ont pas vraiment besoin de l'être ( uint8_t height, width; pourrait se transformer en uint8_t height; uint16_t width; dans le futur et aurait dû être uint8_t height; uint8_t width; pour commencer).

0 votes

Parce que l'écriture uint8_t height; uint16_t width; au lieu de uint8_t height, width; permet d'économiser 10 caractères à l'avenir. :-) vous pouvez bien sûr le faire comme vous le souhaitez. Veillez simplement à ce qu'il soit facilement lisible. La dernière forme est donc la plus explicite.

1 votes

La dernière forme est certainement la plus explicite en indiquant le type de chaque variable et en précisant que chacune est initialisée. Cela dit, elle n'est pas explicite sur le fait que la colonne et la ligne doivent être du même type ou non. Peut-être préférerions-nous tous deux l'explicitation de int presentValue = 0; typeof(presentValue) previousValue = presentValue; mais je crois que typeof() est une extension non standard de GCC.

56voto

muntoo Points 4905

Comme l'a dit @Josh, la bonne réponse est :

int column = 0,
    row = 0,
    index = 0;

Vous devrez faire attention à la même chose avec les pointeurs. Ceci :

int* a, b, c;

Est équivalent à :

int *a;
int b;
int c;

42 votes

Je déteste cette histoire de pointeur, ça n'a aucun sens. L'astérisque fait partie du type, donc il devrait s'appliquer à tous. Imaginez que unsigned long x, y; déclaré x como unsigned long mais y comme juste unsigned , alias unsigned int ! C'est exactement la même chose ! </rant>

8 votes

C'est logique. "int *a, b, c ;"

8 votes

@JeroenBollen Eh bien oui, cela a du sens si vous écrivez vos astérisques de pointeur à côté du nom de la variable au lieu du type, mais cela n'a pas de sens en soi. Comme je l'ai dit plus haut, l'astérisque fait partie du type, pas du nom, donc il devrait être groupé avec le type !

27voto

Mark B Points 60200

Si vous déclarez une variable/objet par ligne, non seulement cela résout ce problème, mais cela rend le code plus clair et évite les erreurs stupides lors de la déclaration des pointeurs.

Pour répondre directement à votre question, vous devez initialiser chaque variable à 0 de manière explicite. int a = 0, b = 0, c = 0; .

20voto

Michael Kristofik Points 16035
int column(0), row(0), index(0);

Notez que ce formulaire fonctionne également avec les types personnalisés, en particulier lorsque leurs constructeurs prennent plus d'un argument.

3 votes

Et aujourd'hui avec une initialisation uniforme (en attendant que le C++17 corrige ce point pour les auto ...) : int colonne { 0 } , rangée { 0 } , indice { 0 } ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X