Le démontage de l'exécution de code:
int i = 0;
xor edx, edx
mov dword ptr i, edx // set i = 0
i += i++;
mov eax, dword ptr i // set eax = i (=0)
mov dword ptr tempVar1, eax // set tempVar1 = eax (=0)
mov eax, dword ptr i // set eax = 0 ( again... why??? =\ )
mov dword ptr tempVar2, eax // set tempVar2 = eax (=0)
inc dword ptr i // set i = i+1 (=1)
mov eax, dword ptr tempVar1 // set eax = tempVar1 (=0)
add eax, dword ptr tempVar2 // set eax = eax+tempVar2 (=0)
mov dword ptr i, eax // set i = eax (=0)
Code équivalent
Il compile sur le même code que le code suivant:
int i, tempVar1, tempVar2;
i = 0;
tempVar1 = i; // created due to postfix ++ operator
tempVar2 = i; // created due to += operator
++i;
i = tempVar1 + tempVar2;
Le démontage de la deuxième code (juste pour prouver qu'ils sont les mêmes)
int i, tempVar1, tempVar2;
i = 0;
xor edx, edx
mov dword ptr i, edx
tempVar1 = i; // created due to postfix ++ operator
mov eax, dword ptr i
mov dword ptr tempVar1, eax
tempVar2 = i; // created due to += operator
mov eax, dword ptr i
mov dword ptr tempVar2, eax
++i;
inc dword ptr i
i = tempVar1 + tempVar2;
mov eax, dword ptr tempVar1
add eax, dword ptr tempVar2
mov dword ptr i, eax
Ouverture de démontage de la fenêtre
La plupart des gens ne savent pas, ou même ne me souviens pas, qu'ils puissent voir la finale de la mémoire de l'assemblée de code, à l'aide de Visual Studio Démontage de la fenêtre. Il montre le code machine est en cours d'exécution, il n'est pas CIL.
Utilisez ce alors que le débogage:
Debug (menu) -> Windows (submenu) -> Disassembly
Donc ce qui se passe avec postfix++?
Le postfix++ indique que nous aimerions pour incrémenter la valeur de l'opérande après l'évaluation... que tout le monde le sait... ce qui brouille un peu est le sens de "après l'évaluation".
Donc, ce n'est "après l'évaluation" signifie:
- les autres usages de l'opérande, sur la même ligne de code doit être affecté:
-
a = i++ + i
la seconde je l'ai est affectée par la valeur de l'échelon
-
Func(i++, i)
le deuxième i est affecté
- d'autres usages sur la même ligne que le respect de court-circuit de l'opérateur comme
||
et &&
:
-
(false && i++ != i) || i == 0
le troisième que je n'est pas affecté par i++ parce qu'il n'est pas évalué
Alors, quelle est la signification de: i += i++;
?
C'est le même que i = i + i++;
L'ordre d'évaluation est:
- Magasin i + i (0 + 0)
- Incrémenter i (i devient 1)
- Affecter la valeur de l'étape 1 à i (i devient 0)
Non pas que l'incrément est d'être jetés.
Quelle est la signification de: i = i++ + i;
?
Ce n'est pas la même chose que l'exemple précédent. La 3e i
est affectée par la valeur de l'échelon.
L'ordre d'évaluation est:
- Magasin que j' (qui est 0)
- Incrémenter i (i devient 1)
- Conserver de la valeur de l'étape 1 + i (0 + 1)
- Affecter la valeur de l'étape 3 à i (i devient 1)