-4
votes

Pourquoi je ne reçois pas une erreur de matrice de sortie lors de l'itération à travers elle?

Alors j'ai mis en place un tableau simple et itérale à travers elle. Pour chaque élément, la matrice [I] est remplie d'une valeur de 100. Je le fais <4 parce que l'arrêté est évidemment [5] n'existe pas pour un éventail de cinq éléments.

Si les tableaux indiquent à 0, pourquoi le compilateur ne me panne-t-il pas? Array [5] ne devrait pas exister ... xxx


12 commentaires

i <4 signifie que les valeurs maximales de i sont trois. i <5 signifie que la valeur maximale de i est 4. Ce qui est correct, vous n'accédez jamais tableau [5] , donc il n'y a donc pas de tableau des limites de votre code.


Votre code ne sort pas de la matrice. Mais même si cela le faisait, rien ne garantit que rien ne vous "paniquer". Sortir des limites est un comportement indéfini, ce qui signifie que tout pourrait arriver.


Je ne comprends pas. Le tableau [5] doit être évalué et rempli de 100. OH Attendez, matray [5] n'existe pas. Pourquoi je ne reçois pas d'erreur? Et qu'entendez-vous par votre explication? @John


int gray [5]; - 5 éléments, index valides 0-4 . pour (int i = 0; i <5; i ++) iTère sur index 0-4 - aucun problème de limites.


Array [4] est correct, alors vous augmentez-vous à 5 à 5, puis vous vérifiez que je <5 est faux, et arrêtez-vous. Vous n'essayez jamais d'utiliser i = 5 parce que la boucle de la boucle est sortie.


Pourquoi je ne reçois pas d'erreur? 1. Parce que vous n'accédez pas au tableau [5] . 2. Parce que même si vous avez fait un comportement indéfini ne signifie pas qu'une erreur montrera.


@Shahjacob Array [i] est uniquement hors limites lorsque i est cinq (ou plus). i <5 empêche i à venir à cinq.


@Shahjacob Votre compréhension des matrices est bonne, c'est autre chose que vous n'obtenez pas. Quelque chose à voir avec l'ordre dans lequel les déclarations exécutent peut-être?


@Shahjacob La valeur la plus élevée possible du i est 4, pas 5.


Dans votre dernière boucle, changez à COUT << "Array [" << I << "]:" << Array [i] << '\ n'; est-ce que je dépasser jamais 4 ?


C'est un point important que si vous voulez que toutes vos erreurs vous soient signalées, n'utilisez pas C ++. Il est conçu pour vous laisser bousiller et aller pour le tour. Comme Drescherjm a dit.


@Kennyostrom merci et tout le monde m'a aidé :)


4 Réponses :


3
votes
int array[5];
array[0] = 100;
array[1] = 100;
array[2] = 100;
array[3] = 100;
array[4] = 100;

5 commentaires

Alors pourquoi le tableau [5] n'est-il pas consulté?


Attends je vois, c'est en train d'être 5 <5 est faux alors la matrice [5] n'est jamais accessible. Serais-je avoir une erreur si je mets 6?


@Shahjacob Le comportement de votre programme serait indéfini si vous avez tenté de lire ou d'écrire la valeur de Array [5] . Il peut produire une erreur, il peut sembler "travailler" ou peut causer des démons de voler de votre nez.


@Shahjacob Vous voudrez peut-être lire le comportement non défini: EN.CPPREFERFERFERATION.COM/W/ CPP / Langue / UB


@Shahjacob "Cela peut causer des démons de voler de ton nez." N'ayez pas peur, cependant. Bien que cela puisse arriver, cela ne m'est jamais arrivé jusqu'à présent.



3
votes

si i <5 alors il doit être 4 ou moins, ce qui signifie que le maximum est tableau [4] , ce qui n'est pas hors de limites.

Je pense que vous devez l'avoir confondu avec faire i <= 5 que vous voyez aussi beaucoup de.


3 commentaires

Cela a probablement un sens. Êtes-vous en train de dire que le tableau [5] n'est jamais atteint car la condition 5 <5 est fausse?


Ouais, exactement ça. Il fonctionne 5 fois lorsque je = 0,1,2,3,4, la prochaine itération définira i = 5, il s'arrête donc avant d'entrer dans le bloc à nouveau comme 5 <5 < / code> retourne false .


Donc <= le rend hors de la liaison. Je vois. Merci de m'aider et de ne pas me descendre à merde :) Je me sens confiant maintenant



1
votes

Vous n'êtes jamais accédé à [5]. Vous avez itéré pour un [0], un [1], un [2], un [3], un [4], un [4], il ne lancera aucune erreur.in condition de boucle que vous avez écrit i <5 pas i <= 5


0 commentaires

1
votes

Lorsque vous déclarez intora [5]; , le 5 ne se réfère pas à une indexation. Il fait référence au nombre d'éléments. Mais seulement à ce stade ... quand vous le déclarez. Plus tard, vous pouvez accéder à la matrice à travers les indices 0-4, que vous faites depuis que vous avez i <5 .

Même si vous deviez accéder à Array [5] Ce n'est pas garanti que votre compilateur paniquerait ... Mais c'est peut-être un autre sujet, ou?


0 commentaires