Réécrire un morceau de code C sans instructions conditionnelles ni opérateurs?

J’étais dans une interview technique où l’interviewer m’a donné un morceau de code comme celui-ci

int a=1; a++; ...something.. ...something. if(a==25) a=0; 

il m’a dit de réécrire ce code sans utiliser switch, if ou l’opérateur ternaire pour la condition if. Comment cela peut-il être fait?

C’est assez simple en fait:

 a *= (a != 25); 

Cela multipliera a par 0 si a est égal à 25, sinon il sera multiplié par 1.

Si vous n’êtes pas non plus autorisé à tester l’égalité, voici une méthode entièrement arithmétique:

 unsigned int v = a - 25; /* test for bits set and put result in lsb of v */ v |= v >> 16; v |= v >> 8; v |= v >> 4; v |= v >> 2; v |= v >> 1; /* set a to a if lsb of v is 1, else set to 0 */ a *= v & 1; 
 a != 25 || (a = 0); 

Ceci n’utilise pas “switch, if else ou ternary operator”

La question, telle que posée, donne un comportement non défini puisque vous utilisez une variable non initialisée. Par conséquent, vous êtes libre d’écrire le code de votre choix (tant qu’il comstack).

Voir la norme C 6.3.2.1p2:

Si la lvalue désigne un object de durée de stockage automatique qui aurait pu être déclaré avec la classe de stockage register (son adresse n’a jamais été prise) et que cet object est non initialisé (non déclaré avec un initialiseur et qu’aucune affectation n’a été effectuée avant son utilisation. ), le comportement est indéfini.

Telle est, à mon avis, la réponse intelligente: même s’il serait sage que vous soyez gracieux lorsque vous répondez à une question de cette façon.

Rappelez-vous que l’affectation n’est qu’une expression ordinaire et qu’elle peut donc être utilisée dans le cadre d’une autre expression. Par exemple, vous pouvez utiliser la logique de court-circuit et l’opérateur:

 a == 25 && (a = 0); 

Vous devez mettre des parenthèses autour de l’affectation car celle-ci a une priorité inférieure à celle de l’opérateur && .

Une autre réponse intéressante pourrait être

 for ( ; a == 25 ; ) { a = 0; break; } 

Ceci n’utilise pas “if-else”, “switch” ou “opérateur ternaire”

Si le contexte impliqué est une boucle de comptage dans laquelle a répète toujours le cycle 0..24 , alors une solution plus attrayante sur le plan mathématique serait

 a = (a+1) % 25; 

Mais bien sûr, cela ne fonctionnerait pas dans une situation où a peut être n’importe quoi, et cela ne devrait être réinitialisé qu’en cas de a==25 , alors que quelque chose de a==26 devrait être laissé seul.

Si vous recherchez une solution “sémantique” comme celle-ci, les enquêteurs aimeront peut-être le vouloir et vous expliquerz quand utiliser cette solution.

Je pense que l’intervieweur voulait que vous utilisiez cette ligne au lieu de if :

 a %= 25;