Ce n' est pas parce qu' je ne comprends rien a ce que tu baragouines que je te donne raison..PAPIPP a écrit :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
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.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 ****************************
A_1=(Not(Not(Not (x=4))=1))
A+
Peso, je m' en tape de ce genre de 'bug' je me démerde pour que ca marche avec les outils dispo...