Aujourd'hui, je suis tombé sur un article de Eric Lippert où il essayait d'effacer le mythe entre la priorité des opérateurs et l'ordre d'évaluation. A la fin, il y avait deux extraits de code qui me suis embrouillé, voici le premier extrait:
int [] arr = {0}; valeur int = arr [arr [0] ++]; Valeur = 1?
int[] arr = {0};
int value = arr[arr[0]++];
Maintenant, quand je pense à la valeur de la variable, je calcule simplement l'un. Voici comment je pensais que ça fonctionnait.
- d'abord déclarer arr comme un tableau d'int avec un élément à l'intérieur de celui-ci; cette valeur de l'élément est 0.
- Deuxième obtenir la valeur de arr [0] - 0 dans ce cas.
- Troisième obtenir la valeur de arr [la valeur de l'étape 2] (qui est encore 0) --gets arr [0] à nouveau --still 0.
- quatrième affecter la valeur de l'étape 3 (0) à la valeur de la variable. --value = 0 maintenant
- Ajouter à la valeur de l'étape 2 1 --Now arr [0] = 1.
Apparemment, cela est faux. J'ai essayé de rechercher les spécifications C# pour une déclaration explicite sur le moment où l'incrément est en train de se produire, mais je n'en ai trouvé aucun.
Le deuxième extrait est d'un commentaire d'Eric de blog post sur le sujet:
int[] data = { 11, 22, 33 };
int i = 1;
data[i++] = data[i] + 5;
est maintenant ici que je pense que ce programme exécutera --after déclarant le tableau et l'attribution d'1 à i. [Plz ours avec moi]
- Obtenir des données [i] --1
- Ajouter à la valeur de l'étape 1 la valeur 5 --6
- Assigner aux données [i] (ce qui est encore 1) la valeur de l'étape 2 --data [i] = 6
- i Increment - i = 2
Selon ma compréhension, ce tableau doit maintenant contenir les valeurs {11, 27 , 33}. Cependant, quand j'ai bouclé pour imprimer les valeurs de tableau que j'ai: {11, 38, 33}. Cela signifie que l'incrément post s'est produit avant de déréférencer le tableau!
Comment ça se fait? Ce post-incrément n'est-il pas censé être post? C'est-à-dire après tout le reste.
Qu'est-ce qui me manque les gars?
Votre cinquième étape n'est pas correct de toute façon. "Ajouter à la valeur de l'étape 2 1 - Maintenant arr [0] = 1." La valeur qui est prise/copiée du tableau est incrémentée d'un, mais la valeur ** dans ** le tableau n'est pas touchée. Donc, l'instruction arr [0] = 1 est fausse. La valeur copiée de arr [0] = 1 à l'étape 5. – Gertjan
Eh bien, j'ai juste couru le code et j'ai eu la valeur 0 pour la première réponse et {11,27,33} comme seconde ... Est-ce que ce compilateur est spécifique? ? – bubblegum
@Swabha êtes-vous sûr d'utiliser C#? – Galilyou