Bonjour à tous
Voici ma petite contribution à ce débat.
Opérateur "=" est à la fois un opérateur d’affectation et un opérateur logique de TEST d’égalité
Comment le compilateur PB se tire de ce pb ?
Pas très bien à mon avis mais cela n’est pas très grave puisque nous pouvons trouver un mode de contournement
Dans l’expression A0=1 c’est l’opérateur d’affectation qui est sollicité.
Dans l’ expression If A0=1 c’est l’opérateur logique.
Mais dans l’expression A0=(Not X=0) quel est l’opérateur sollicité ?
Voyons cela de plus près et regardons les résultats ainsi que les générés ASM DE PB 4,51
remplaçons dans x les 0 par 2 et les 1 par 4 afin d'éviter les valeurs logiques 0 et 1 qui peuvent poser pb à l'interprétation
; *********************************************************************************************
; Niveau de priorité | Opérateurs
; --------------------+---------------------
; 8(haute) | ~,-
; 7 | <<,>>,%, !
; 6 | | , &
; 5 | *,/
; 4 | +,-
; 3 | >,>=,<,<=,=,<>
; 2 | Not
; 1(basse) | And, Or, XOr
******** Dans cette hiérarchie les parenthèses ont été oubliées ont peut les placer au plus haut de cette priorité
;******** l'opérateur d'affectation "=" a lui aussi été oublié il doit être au moins au niveau des parenthèses sinon plus haut
Code : Tout sélectionner
x=4
A_0=(Not x=4)=0
Debug A_0
;************** généré ASM de A_0=(Not x=4)=0
; x=4
; MOV dword [v_x],4
; ; A_0=(Not x=4)=0
; MOV ebx,dword [v_x]
; CMP ebx,4
; JNE No0
; XOR eax,eax
; JMP Ok0
; No0:
; MOV eax,1
; Ok0:
; MOV ebx,eax
; AND ebx,ebx
; MOV dword [v_A_0],0 ====> simple affectation de la valeur 0 a v_A_0 donc à A_0 et non résultat d'une relation logique
; ; Debug A_0
x=4
A_1=(Not x=4)=1
Debug A_1
;************** généré ASM de A_1=(Not x=4)=1
; ; x=4
; MOV dword [v_x],4
; ; A_1=(Not x=4)=1
; MOV ebx,dword [v_x]
; CMP ebx,4
; JNE No1
; XOR eax,eax
; JMP Ok1
; No1:
; MOV eax,1
; Ok1:
; MOV ebx,eax
; CMP ebx,1
; MOV dword [v_A_1],1 ====> simple affectation de la valeur 1 a v_A_1 donc à A_1 et non résultat d'une relation logique
; ; Debug A_1
;**************** maintenant avec double parenthèses pour essayer que l'opérateur "=" soit un opérateur logique
x=4
A_0=((Not x=4)=0)
Debug A_0
;************** généré ASM de A_0=((Not x=4)=0)
; ; x=4
; MOV dword [v_x],4
; ; A_0=((Not x=4)=0)
; MOV ebx,dword [v_x]
; CMP ebx,4
; JNE No2
; XOR eax,eax
; JMP Ok2
; No2:
; MOV eax,1
; Ok2:
; MOV ebx,eax
; AND ebx,ebx
; MOV dword [v_A_0],0====> simple affectation de la valeur 0 a v_A_0 donc à A_0 et non résultat d'une relation logique
; ; Debug A_0
; ************ Les doubles parenthèses ne suffisent pas a changer l'opérateur "=" d'affectation en opérarteur logique
;**************** il existe des opérateurs qui ne nécessitent qu'une opérande. Il sont appelés opérateurs Monadiques.
;**************** Comme Not et un opérateur monadique de priorité 2 nous allons utiliser deux not => qui correspondent à ne rien faire
;**************** Comme "=" Opérateur logique a un niveau de priorité de 3 il faut placer deux NOT de priorité 2 qui ne font rien d'autre que
;**************** d'obtenir que "=" soit une opérateur logique
x=4
A_0=(Not(Not(Not (x=4))=0))
Debug A_0
;************** généré de A_0=(Not(Not(Not (x=4))=0))
; ; x=4
; MOV dword [v_x],4
; ; A_0=(Not(Not(Not (x=4))=0))
; MOV ebx,dword [v_x]
; CMP ebx,4
; JNE No2
; XOR eax,eax
; JMP Ok2
; No2:
; MOV eax,1
; Ok2:
; MOV ebx,eax
; AND ebx,ebx
; JNE No3
; XOR eax,eax
; JMP Ok3
; No3:
; MOV eax,1
; Ok3:
; AND eax,eax
; JE No4
; XOR eax,eax
; JMP Ok4
; No4:
; MOV eax,1
; Ok4:
; MOV dword [v_A_0],eax
; ; Debug A_0
;************************ POUR VERIFICATION INVERSONS LE TEST AVEC 1
x=4
A_1=(Not(Not(Not (x=4))=1))
Debug A_1
; ; x=4
; MOV dword [v_x],4
; ; A_1=(Not(Not(Not (x=4))=1))
; MOV ebx,dword [v_x]
; CMP ebx,4
; JNE No5
; XOR eax,eax
; JMP Ok5
; No5:
; MOV eax,1
; Ok5:
; MOV ebx,eax
; CMP ebx,1
; JNE No6
; XOR eax,eax
; JMP Ok6
; No6:
; MOV eax,1
; Ok6:
; AND eax,eax
; JE No7
; XOR eax,eax
; JMP Ok7
; No7:
; MOV eax,1
; Ok7:
; MOV dword [v_A_1],eax
; ; Debug A_1
; ********************** Les Résulats sont conforment à la logique CQFD ****************************
En résumé pour que l'opérateur "=" soit un opérateur logique il faut baisser son niveau de priorité comme dans l'exemple suivant.
A_1=(Not(Not(Not (x=4))=1))
A+