2010-10-21 12 views
13

duplicados posibles:
Stupid Question Regarding If-Else's Simultaneous Execution in C++ or C
Is it possble to execute both if and else part of an if — else control statement ?Ejecución de ambos 'si', así como en bloque 'else'

Hola a todos .. que tenía una pregunta en una entrevista como esta que no pude responder Considera seguir Bloque de código. Suponer los archivos de encabezado necesarios.

if(.......) 
{ 
    printf("hello"); 
} 
else 
{ 
    printf("world"); 
} 

sin mover/añadir ningún código & sin el uso de declaraciones de impresión adicionales Trae salida como "Hola mundo" .. Tienes que escribir la condición que falta en la sentencia if .. es posible la ejecución de ambos bloques alguna condición? Por favor, ayuda

+0

@Steve hubo una buena sugerencia con 'setjump()'. Es posible que esperaran esa solución. No estoy seguro, pero ¿se imprimirá un proceso bifurcado en la misma consola? – ruslik

+1

Esto NO es un duplicado de las otras preguntas. El OP simplemente pone el título incorrecto en la pregunta. NO le pide que ejecute el if, sino que simplemente le pide que inserte una condición que genere el resultado solicitado. Mi solución está abajo. –

+0

@Larry: Supuse que fue un error en la pregunta que permite su respuesta. Dice, "sin uso de instrucciones de impresión adicionales", que tomé para incluir llamadas a 'printf', ya sean declaraciones o simplemente expresiones. También el texto "es posible ejecutar ambos bloques por alguna condición" * es * un engaño. En contra de eso, haciendo de esto una pregunta completamente diferente, la salida solicitada es "Hola mundo" (note el capital H y el espacio), sugiriendo que el primer bloque debería * no * ser ejecutado. Además, la solución 'fork()' no ordena los bloques, podrían ejecutarse en cualquier orden o simultáneamente. –

Respuesta

34

prueba fork()! (y únete luego). Esa es la única característica que involucra mecánica cuántica que yo sepa.

fork() devuelve dos valores distintos a la vez, que solo el gato de Schrödinger puede.

NOTA: En un comentario, Donal Fellows sugiere:

Usted obtendrá un comportamiento más fiable con !vfork()

+11

... y espero que impriman en el orden correcto. – user470379

+2

¿No sería esa una terrible práctica de programación? ¿Por qué esperarían que alguien supiera (y mucho menos lo hiciera) eso en una entrevista? :/ –

+0

Creo que esperan que las personas sean imaginativas ... – Benoit

0

No, no es posible. O bien se ejecutará el primer bloque o el bloque else; esa es la naturaleza de una declaración if.

+2

Estás equivocado. :-) – SmallChess

0

No hay forma de ejecutar ambas ramas de un if/else sin explotarlo con cosas raras. Si una condición es verdadera, la otra no se ejecutará y viceversa.

Son absolutamente mutuamente exclusivos.

0

No sin iterar nuevamente. No creo que puedas hacer ningún dispositivo Duff como la locura en las declaraciones de if. Supongo que podrías usar goto, dices simplemente escribiendo la condición.

0

En un depurador podría pasar por el bloque if, luego mover la ejecución al bloque else para ejecutar, pero eso es solo una respuesta tonta a lo que me parece una pregunta tonta.

3

Puede, pero es probable que sea una mala práctica. Parece que el entrevistador estaba probando su conocimiento del idioma. Construido con gcc 4.1.2.

#include <stdio.h> 

int main() { 
    if(!printf("hello ")) { 
    printf("hello"); 
    } else { 
    printf("world"); 
    } 

    return 0; 
} 
+0

Por favor, dígame cómo ... Se agregará a mi conocimiento ... :-) – Prashant

+0

@Prashant: Actualizado con el código –

2

Hay una manera posible, no se recomienda.

if(check==true) 
{ 
printf("dont do this"); 
goto condition1; 
} 
else 
{ 
condition1: ////this is crazy 
printf("Dont do this ever"); 
} 
+3

+1 para el pensamiento deformado, pero falla la restricción "sin mover/agregar ningún código"? –

+0

¡* engañó *! de ninguna manera puedes poner nada dentro de los bloques '{}' de acuerdo con la pregunta :) – Benoit

+1

Tienes razón hice trampa, no sopa para mí. Esta pregunta es bastante loca –

-1

usted podría intentar:

if() 
{ 
printf("hello"); 
goto Found; 
} 
else 
{ 
Found: printf("world"); 
} 
16

Si usted puede poner en una definición de macro como "parte" de esa condición ...

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

Luego de que el código será de hecho imprimir "helloworld". Es un truco horrible, sucio; ¡Mi alma probablemente tiene problemas por mencionarla!

+0

Sí, eso también es genial :) No te olvides de '# undef' it. Creo que podrías simplemente '#define else'. Solo tendrá el alcance de 'printf (" world ");'. – Benoit

+0

No entiendo la idea ... – Ichibann

+1

esto hará: 'if (1) {printf (" hello ");} if (1) {printf (" world ");}' – Benoit

0

La forma más fácil que creo que es la siguiente:

//if(.......) 
{ 
    printf("hello"); 
} 
//else 
{ 
    printf("world"); 
} 
+1

'else' no puede existir sin' if'. –

+0

Mi mala :) Se corrigió – Sergio

+0

Esta pregunta dice '.Tienes que escribir la condición faltante en la instrucción if ..' –

7

Depende de la redacción exacta de la cuestión. Como usted lo describe, la pregunta no le pide que ejecute ambas ramas de la instrucción if. Le pide que inserte una condición que resulte en la impresión de "hello world" sin cambiar nada más.

Si usted tiene total libertad en lo que se pone en la condición, puede utilizar esta solución:

if(printf("hello ") == -1) 
{ 
    printf("hello"); 
} 
else 
{ 
    printf("world"); 
} 

Sin embargo, la solución utiliza "printf" en la condición, que es gobernado por una de las reglas que diste Lo que no tengo claro es si la prohibición de imprimir también se aplica a lo que escribe en la condición.

Nota: La respuesta está editada para reflejar los comentarios. La respuesta original ignoró la prohibición de las declaraciones impresas.

+0

'..sin mover/agregar ningún código y sin el uso de declaraciones de impresión adicionales traer la salida como" Hola mundo " ..' Entonces, esto no cumple con los requisitos. –

+0

El problema es ... la pregunta no requiere declaraciones de impresión adicionales. Si bien podrías intentar argumentar ante el juez que el 'printf' que insertaste es una expresión de impresión (¡complicado!), Sospecho que no te dará crédito. Buen intento sin embargo. –

+0

Bueno, ustedes pueden tener razón dependiendo de la fraseología original de la pregunta. Si se le permite ingresar cualquier cosa que desee en la condición (y la prohibición de agregar código solo se aplica fuera de la condición), entonces la solución permanece en pie. Pero si la prohibición se aplica también dentro de la condición, obviamente mi solución no es válida. –

0

¿No funcionaría?

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

¿Has leído las condiciones? 'sin mover/agregar ningún código y sin el uso de declaraciones de impresión adicionales traer la salida como" Hola mundo "..' –

+0

... tanto para mi primera respuesta aquí :) – singhularity

35

Esto funcionará

if(schrodingers_cat_is_dead()) 
{ 
    printf("hello"); 
} 
else 
{ 
    printf("world"); 
} 

Por desgracia, tan pronto como se mira a la salida, no sólo va a colapsar en el estado de solamente la producción de "hola" o "mundo", pero hay una 50% de probabilidad de que haya asesinado a un gato.

+4

Esto fue muy divertido. Gracias. –

+10

¿Podría el votante de abajo explicar por qué no tienen sentido del humor? – JeremyP