2015-07-24 4 views
3

je parcourais un projet et est tombé sur ceci:Signification de la déclaration de côté effectless bizarre à l'intérieur si

if(!StaticAnimatedEntities) 
    int esko = esko = 2; 

(Le type de StaticAnimatedEntities ici est un non signé plaine courte.)

Il m'a frappé comme très étrange, donc j'ai grevé le projet pour esko et trouvé d'autres similaires if s avec rien mais cette ligne à l'intérieur d'eux, par exemple. ceci:

if(ItemIDMap.find(ID) != ItemIDMap.end()) 
    int esko = esko = 2; 

(Notez qu'il n'y a pas d'autres variables nommées esko en dehors de ces if s.)

Quelle est la signification de cette pièce cryptique de code?

+2

Pour ce que ça vaut, je suis à peu près sûr qu'il s'agit d'un no-op complet (enfin, sauf si 'StaticAnimatedEntities' est une instance d'une classe surchargée' operator! ') –

+1

Probablement juste copier et coller les ordures. –

+0

Comment une question peut être simultanément C++ et agnostique? :-) – Michael

Répondre

5

Vous pouvez parfois voir un code comme celui-ci juste pour servir d'emplacement d'ancrage pour mettre un point d'arrêt dans un débogueur interactif afin de piéger certaines conditions "inhabituelles" (le plus souvent - erronées).

Les points d'arrêt conditionnels fournis par le débogueur sont généralement très lents et/ou primitifs. Les personnes planifient donc délibérément à l'avance et fournissent de telles branches conditionnelles afin de créer un emplacement compilé pour un point d'arrêt. Un tel point d'arrêt conditionnel compilé ne ralentit pas l'exécution du programme presque autant qu'un point d'arrêt conditionnel fourni par le débogueur le ferait.

Dans de nombreux cas, ce code est entouré de #ifndef NDEBUG/#endif pour l'empêcher d'entrer dans les générations de production. Dans d'autres cas, les gens la laissent sans protection, croyant que l'optimisation du compilateur l'enlèvera de toute façon.

Pour que cela fonctionne, le code sous if devrait générer du code machine dans les versions de débogage. Sinon, il serait impossible de mettre un point d'arrêt dessus. Différentes personnes ont des préférences différentes à cet égard, mais le code a toujours l'air bizarre et vide de sens.

C'est l'absence de sens de ce code qui offre aux programmeurs une liberté totale d'écrire tout ce qu'ils veulent. Et je dirais que cela fait souvent partie du style de signature de chaque programmeur, une sorte d'empreinte digitale. Le gars en question fait int esko = esko = 2;, apparemment.

+3

Je pense que vous devez avoir raison. Esko est un prénom masculin en finnois. Probablement le programmeur. – Gene

+0

Cela a du sens. Je me demande pourquoi '2' ... – emlai