Erreurs, bugs, questions - page 2866

 
A100:

Tout est possible, seule une macro doit être ajoutée

Résultat : 20.

C'est très bien. Je ne suis pas doué pour deviner les énigmes.

 
Vladimir Simakov:

Désolé, je me suis embrouillé en essayant de m'expliquer))))

Encore une fois :

Au moment de la deuxième définition de VALEUR, la macro VALEUR n'est pas définie, et VALEUR est donc définie comme suit

parce que le TMP était et est toujours défini par la VALEUR.

Mais le TMP, après la deuxième définition de la VALEUR, est étendu à

(Quelque chose comme ça))

Le préprocesseur ne fait que remplir ce qu'il a et peu importe comment et où il est défini. C'est pourquoi vous devez être prudent avec elle. Exemple :

et maintenant, ajoutons une chose maléfique à la fonction, à savoir un effet secondaire

Et c'est juste une inscription, mais que faire si le dépôt dépend de cette fonction ?

drôle) quand tu l'auras)

#define  VALUE 10        
#define  TMP VALUE       
#undef  VALUE     

J'ai bien compris, après avoir annulé la substitution, la première ligne n'est plus 10 et le deuxième TMP est VALEUR, mais pas 10. C'est-à-dire que la substitution est loin d'être une affectation.

 
Valeriy Yastremskiy:

drôle) quand vous l'aurez)

J'ai bien compris, après avoir annulé la substitution, la première ligne n'est plus 10 et le second TMP est une VALEUR, mais pas 10. C'est-à-dire qu'une substitution est loin d'être une affectation.

Oui. Une substitution est exactement une substitution, une à une. Mais lorsque la macro VALUE est définie dans votre code (à ne pas confondre avec la directive du préprocesseur), le préprocesseur développe davantage TMP->VALUE->10 et sinon, TMP->VALUE. Dans ce cas, les directives du préprocesseur ne sont pas impliquées dans le code lui-même, elles ne sont plus là une fois compilées. Exemple :

#define  VALUE 10
#define  TMP VALUE

void OnStart()
{
   Print(TMP); //10
if (false){
   #undef  VALUE
   #define  VALUE 20
   Print(TMP);}
else Print(TMP); //20
}
 
Vladimir Simakov:

Oui. La substitution est exactement la substitution, une à une. Simplement, lorsque la macro VALUE est définie lors de la substitution dans votre code (à ne pas confondre avec les directives du préprocesseur), le préprocesseur développera TMP->VALUE->10, et sinon, TMP->VALUE. Dans ce cas, les directives du préprocesseur ne sont pas impliquées dans le code lui-même, elles ne sont plus là une fois compilées. Exemple :

Oui, si vous commentez la deuxième substitution VALUE 20, la déclaration de la variable VALUE disparaîtra et le compilateur ne la verra pas et grondera).

 
A100:

Tout est possible, seule une macro doit être ajoutée

Résultat : 20

J'abandonne)))

Comment est-il défini ?

MACRO

?

 
Vladimir Simakov:

J'aband onne)))

Comment certains

?

Si vite ? Tous les spécialistes ne se sont pas encore joints à nous... Nous allons attendre une semaine.

Conseil : ceci fonctionne également (mais la solution est légèrement différente)

#define  VALUE1 10
#define  VALUE2 5

MACRO2( VALUE1, VALUE12 )
MACRO2( VALUE2, VALUE22 )

#define  VALUE1  VALUE12*2
#define  VALUE2  VALUE22*3

int f1( int i = VALUE1 ) { return i; }
int f2( int i = VALUE2 ) { return i; }
void OnStart()
{
        Print(f1(),":",f2());
}

Résultat : 20:15

 
Vladimir Simakov:

parce que le TMP était, et est toujours, défini par la VALEUR.

C'est là qu'intervient la réfutation "du haut vers le bas".

Sinon, le TMP n'aurait pas été "tel que défini, il reste donc défini", mais aurait été préalablement remplacé par 10 (auquel VALUE est remplacé).

Le préprocesseur ne traite donc pas le code ligne par ligne. Ce qui reste à découvrir, c'est comment.


@A100, si vous le voulez bien, en quelques mots.
Pas assez intéressant pour le googler et le lire, mais assez pour le demander.

Quel est le problème avec ma logique ?

J'ai imaginé que les cordes sont analysées de manière séquentielle. Il n'y a donc pas de valeur indéfinie à droite :

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10, следовательно VALUE = 20
 
A100:

Conseil : ceci fonctionne également (mais la solution est légèrement différente)

Donc identique en action à MACRO et MACRO2.

 
Andrey Khatimlianskii:

Quel est le problème avec ma logique ?

#define  VALUE 10       // VALUE = 10
#define  TMP VALUE      // TMP = 10 VALUE
#undef  VALUE           // VALUE = EMPTY
#define  VALUE (TMP*2)  // TMP = 10 EMPTY, следовательно VALUE = 20 EMPTY
 
A100:
#define  TMP VALUE      // TMP = 10 VALUE

Je l'ai compris, je l'ai interprété différemment ici.

Ce n'est pas une constante, mais une macro, après tout.

Merci.
Raison: