¿Reescribiendo un fragmento de código C sin instrucciones condicionales u operadores?

Estuve en una entrevista técnica donde el entrevistador me dio un código como este.

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

él me dijo que reescribiera este código sin usar el interruptor, en caso contrario u operador ternario para la condición if. ¿Cómo se puede hacer?

Es bastante simple en realidad:

 a *= (a != 25); 

Esto multiplicará a por 0 si a es igual a 25, de lo contrario multiplicará a por 1.

Si tampoco tienes permitido probar la igualdad, aquí hay una forma completamente aritmética:

 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); 

Esto no usa “switch, if else u ternary operator”

La pregunta, tal como se plantea, da un comportamiento indefinido ya que está utilizando una variable sin inicializar. Por lo tanto, eres libre de escribir cualquier código que desees (siempre que se compile).

Ver el estándar C 6.3.2.1p2:

Si el lvalue designa un objeto de duración de almacenamiento automático que podría haberse declarado con la clase de almacenamiento de registro (nunca se tomó su dirección), y ese objeto no está inicializado (no se declaró con un inicializador y no se realizó ninguna asignación antes de su uso) ), el comportamiento es indefinido.

Esa, en mi opinión, es la respuesta inteligente: aunque sería prudente ser agraciado al responder una pregunta de esta manera.

Recuerde que la asignación es solo una expresión ordinaria, y como tal se puede usar como parte de otra expresión. Por ejemplo, podría utilizar el operador y el lógico de cortocircuito:

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

Debe colocar paréntesis alrededor de la asignación porque la asignación tiene menor prioridad que el operador && .

Otra respuesta interesante podría ser

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

Esto no usa ‘if-else’, ‘switch’ u ‘operador ternario’

Si el contexto implícito es un bucle de conteo donde a siempre repite el ciclo 0..24 , entonces quizás una solución matemáticamente más atractiva sería

 a = (a+1) % 25; 

Pero esto, por supuesto, no funcionaría en una situación en la que a puede ser cualquier cosa, y solo debería restablecerse en caso de a==25 , mientras que algo a==26 debe dejarse solo.

Sin embargo, a los entrevistadores les puede gustar, si busca una solución “semántica” como esa, y puede explicar cuándo usarla.

Creo que el entrevistador quería que usaras esta línea en lugar de if :

 a %= 25;