2008-08-28 9 views
29

¿Sería posible imprimir Hello dos veces con el número condition?¿Cuál es la "condición" en la prueba de entrevista C?

if "condition" 
    printf ("Hello"); 
else 
    printf("World"); 
+0

Me refiero a lo que debería ser código en condición 'si' si queremos ejecutar el código en ambos bloques? – user215968

+0

Muestra el código para que podamos echar un vistazo. –

+0

@Michael Esta pregunta fue solicitada para una entrevista, le dije lo mismo ... pero el tipo del otro lado dijo que puede hacer eso en C. – user215968

Respuesta

83
if (printf("Hello") == 0) 
    printf ("Hello"); 
else 
    printf ("World"); 

:-)

+1

Nunca pensé en eso. – fastcodejava

+2

Para printf: en caso de éxito, se devuelve la cantidad total de caracteres escritos. – Lesswire

5

La declaración if ejecuta uno u otro de los estados controlados (tanto printf en su ejemplo). No importa lo que use para condition, ese fragmento imprimirá "Hola" o "Mundo", pero nunca ambos.

Editar: Bueno, entonces es una pregunta capciosa y puedes poner lo que quieras en la condición (incluyendo una llamada a una función completa que hace lo que quieras). Pero eso no es muy interesante. No puedo creer que me hayan modificado para dar una respuesta correcta.

+3

No puedo creer que ya sea, quien lo hizo en mi opinión era pequeña/cojos . Así que aquí hay un representante de vuelta :) No debería haber sanciones negativas por no ser lo suficientemente "inteligente" como para ver la solución y publicar lo que realmente pensaste que era correcto. – freespace

0
if(printf("Hello") == 1) 
    printf("Hello") 
else 
    printf("World") 
2
if (true) printf ("Hello"); if (false) 
    printf ("Hello"); 
else 
    printf("World"); 
21
"condition" === (printf("Hello"), 0) 

muy escaso:

int main() { 
    if (printf("Hello"), 0) 
     printf ("Hello"); 
    else 
     printf("World"); 
} 

prefiero el uso del operador coma, ya que no tiene que buscar el valor de retorno de printf con el fin de saber lo que hace el condicional. Esto aumenta la legibilidad y la facilidad de mantenimiento. :-)

1

Esto podría funcionar:

if (printf("Hello") - strlen("Hello")) 
    printf("Hello") 
else 
    printf("World") 

Este fragmento hace hincapié en el valor de retorno de printf: El número de caracteres impresos.

0
if (printf("Hello") < 1) 
    printf("Hello"); 
else 
    printf("World"); 
6
#define CONDITION (0) if (0) {} else 

o algo así.

Si ve una pregunta de este tipo en una entrevista, ¡huya tan rápido como pueda! El equipo que hace tales preguntas seguramente no será saludable.

Editar - Me olvidé de aclarar - esto se basa en "más" que coincida con el más cercano abierto "si", y en el hecho de que está escrito como "si CONDICIÓN" en lugar de si (CONDICIÓN) - paréntesis haría el rompecabezas insoluble.

0

Greg escribió:

No importa lo que se utiliza para la condición, que o bien se fragmento de impresión "Hola", o "mundo", pero nunca ambos.

Bueno, esto no es cierto, pero por las que se desee que imprima tanto, no puede encontrar un caso de uso para. Está derrotando el punto de tener una declaración if. La posible solución "real" es no usar un si en absoluto. Preguntas tontas entrevista ...:)

0

Muchachos muy interesantes, gracias por las respuestas. Nunca hubiera pensado poner la declaración de impresión dentro de la condición if.

Aquí es el equivalente de Java:

if (System.out.printf("Hello").equals("")) 
     System.out.printf("Hello"); 
    else 
     System.out.printf("World"); 
3

Sin conocer el valor de retorno de printf de la parte superior de la cabeza:

if (printf("Hello") && 0) 
    printf("Hello"); 
else 
    printf("World"); 
11

Si está en Unix:

if (fork()) 
    printf ("Hello"); 
else 
    printf("World"); 

Ofcoures that does not guarantee the order 0f the prints

1

Solución 1:

int main(int argc, char* argv[]) 
{ 
    if(argc == 2 || main(2, NULL)) 
    { 
     printf("Hello "); 
    } 
    else 
    { 
     printf("World\n"); 
    } 
    return 0; 
} 

Solución 2 (Sólo para Unix y Linux):

int main(int argc, char* argv[]) 
{ 
    if(!fork()) 
    { 
     printf("Hello "); 
    } 
    else 
    { 
     printf("World\n"); 
    } 
    return 0; 
} 
2

Sin amor por exit?

if(printf("HelloWorld"), exit(0), "ByeBye") 
    printf ("Hello"); 
else 
    printf ("World"); 
0

No utilice entonces un bloque if else.

EDITAR para Comentar.

Podría significar que el código debe estar en ambos bloques, o antes/después del bloque si se requiere que se ejecute en ambos casos.

+0

¿cuál debería ser el código en condición 'si' si queremos ejecutar código en ambos bloques? – user215968

2

Entonces ... ¿desea ejecutar el código dentro del bloque if ... y el código dentro del bloque else ... de la misma instrucción if/else? Entonces ... deberías deshacerte de lo demás y pegar el código en el si.

if something 
    do_this 
    do_that 
end 

La sentencia else está diseñado para ejecutar sólo si la sentencia if no se ejecuta y viceversa, que es el punto entero. Esta es una pregunta extraña ...

1

Simplemente coloque el código antes o después del bloque if..else.

Alternativamente, si tiene un bloque "if, else if, else" donde quiere ejecutar código en algunas (pero no en todas) las ramas, simplemente póngalo en una función separada y llame a esa función dentro de cada bloque.

3

comentario a la "cosa";)

if(foo) 
{ 
    bar(); 
} 
//else 
{ 
    baz(); 
} 
+0

¡Gran respuesta! Buen uso del comentario. – fastcodejava

13

abrocharse el cinturón de seguridad:

#include <stdio.h> 
#include <setjmp.h> 

int main() 
{ 
    jmp_buf env; 

    if (!setjmp(env)) 
    { 
     printf("if executed\n"); 
     longjmp(env, 1); 
    } 
    else 
    { 
     printf("else executed\n"); 
    } 

    return 0; 
} 

Prints:

if executed 
else executed 

Es esto lo que quiere decir? Lo dudo, pero al menos es posible. Usando fork puede hacerlo también, pero las ramas se ejecutarán en diferentes procesos.

+1

Cuidado: no se puede asignar de forma portátil el valor de retorno de la macro setjmp(). –

+0

@jonathan - tienes razón, corrigió el código. Sin embargo, me pregunto si hoy hay algún compilador que no lo maneje correctamente. Muchos marcos de "excepción" C basados ​​en setjmp usan su valor de retorno guardado en un indicador –

+0

En la práctica, probablemente funcione; Ciertamente no conozco una plataforma en la que no funcione, pero tampoco he investigado, porque la depuración de la falla sería dolorosa (en el mejor de los casos). Asignar el valor de retorno de 'setjmp()' es un comportamiento indefinido; cualquier cosa podría suceder (incluso 'funciona como se espera o se desea'). –

16

Esto me suena como un acertijo de entrevista. Espero que esto esté cerca de lo que quieres.


#include <stdio.h> 

int main() 
{ 
static int i = 0 ; 
if(i++==0 ? main(): 1) 
    printf("Hello,"); 
else 
    printf("World\n"); 

return 0 ; 
} 

impresiones Hello, World

+0

Gracias por responder Neeraj! – user215968

+1

Creo que esta debería ser la respuesta aceptada. No utiliza horquillas, por lo que la orden está garantizada y tampoco imprime "Hola" en la condición. La ejecución realmente entra en las dos ramas de decisiones ... De lo contrario, podría imprimir todo en la condición y luego finalizar el programa, ¡creo que no es una solución muy inteligente! –

0

utilizar un Goto, una de las únicas palabras clave más infrautilizados de nuestros días

+1

Y, posiblemente, uno de los más peligrosos, como han mencionado Dijkstra y otros. – Matthew

+1

goto no es tan peligroso como el operador de desreferencia de matriz. –

3

La respuesta básica es que en el curso normal de los acontecimientos que no desea ejecutar tanto las declaraciones en el bloque 'if' y el bloque 'else' en un solo paso a través del código (por qué molestarse con la condición si lo hace) ni puede ejecutar ambos conjuntos de declaraciones sin saltar a través de aros grotescos.

Algunos aros grotescos - código malvado!

if (condition == true) 
    { 
     ...stuff... 
     goto Else; 
    } 
    else 
    { 
Else: 
     ...more stuff... 
    } 

Por supuesto, se trata de un abuso de llanura de (cualquier) el lenguaje, ya que es equivalente a:

if (condition == true) 
    { 
     ...stuff... 
    } 
    ...more stuff... 

Sin embargo, se podría lograr lo que pide la pregunta. Si tiene que ejecutar ambos bloques si la condición es verdadera o falsa, entonces las cosas se vuelven un poco más complicadas.

done_then = false; 
    if (condition == true) 
    { 
Then: 
     ...stuff... 
     done_then = true; 
     goto Else; 
    } 
    else 
    { 
Else: 
     ...more stuff... 
     if (!done_then) goto Then; 
    } 
+0

+1 Haha, solo quería publicar eso también. –

+0

Una versión "aún más malvada" del código invierte las etiquetas (por lo que la cláusula 'then' tiene una etiqueta 'Else' y viceversa). Y tal vez el "último" en el mal-insistencia insiste en que los bloques de código se ejecutan en el mismo orden, independientemente del resultado de la condición (que se puede hacer, por supuesto). Pero los requisitos son cada vez más exagerados y ridículos, ¡si es que aún no lo eran! –

+1

Por lo que yo creo que solicitaron una condición, no una "Goto" de la cuenta, se rompió esa regla en mi sentido –

3
int main() 
{ 
    runIfElse(true); 
    runIfElse(false); 

    return 0; 
} 

void runIfElse(bool p) 
{ 
    if(p) 
    { 
    // do if 
    } 
    else 
    { 
    // do else 
    } 
} 
+0

No está claro lo que significa la pregunta por 'correr', ¿verdad? +1 por distorsionar la pregunta de una manera diferente. –

0

Cheeting con una sentencia else vacío:

if (condition) 
    // do if stuff 
else; 
    // do else stuff 

Si no les gusta el hecho de que los demás; es en realidad una sentencia else vacío intente esto:

for (int ii=0; ii<2; ii++) 
{ 
    if (condition && !ii) 
     // do if stuff 
    else 
    { 
     // do else stuff 
     break; 
    } 
} 
0

dos soluciones posibles sin usar printf: -

Primero: -

#include <stdio.h> 

int 
main(void) 
{ 
    if (!stdin || (stdin = 0, main())) 
    printf("hello"); 
    else 
    printf("world"); 
    return 0; 
} 

Segunda

#include<stdio.h> 
void main() 
{ 
if (1 
#define else if (1) 
) 
{ 
    printf("hello"); 
} 
else 
{ 
    printf("world"); 
} 
} 

Referencia: - Link1, Link2

-2

La condición a esta pregunta es:

if(printf("hello")? 0 : 1) { } 
+0

si (printf ("hola") 0: 1) {} demás printf ("mundo"); – mafia

0
if (printf("hello") & 0) 
{ 
printf("hello"); 
} 
else 
{ 
printf("world"); 

No hay necesidad de preocuparse por el valor de retorno de printf.

1
#include<stdio.h> 
    int main() 
{ 
if(! printf("Hello")) 
    printf ("Hello"); 
else 
    printf ("World"); 
return 0; 
} 

Porque Printf devuelve el número de caracteres que se ha impreso correctamente.

0

Abuso de preprocesamiento, con limpieza al menos.


#define else 
if(1) 
{ 
    printf("hello"); 
} 
else 
{ 
    printf("world"); 
} 
#undef else 
Cuestiones relacionadas