Qual é a “condição” no teste de entrevista C?
-
09-06-2019 - |
Pergunta
Seria possível imprimir Hello
duas vezes usando único condition
?
if "condition"
printf ("Hello");
else
printf("World");
Solução
if ( printf("Hello") == 0 )
printf ("Hello");
else
printf ("World");
:-)
Outras dicas
"condition" === (printf("Hello"), 0)
Realmente chato:
int main() {
if (printf("Hello"), 0)
printf ("Hello");
else
printf("World");
}
Prefiro o uso do operador vírgula porque você não precisa procurar o valor de retorno de printf
para saber o que a condicional faz.Isso aumenta a legibilidade e a capacidade de manutenção.:-)
Isso me parece um quebra-cabeça de entrevista.Espero que isso esteja próximo do que você deseja.
#include <stdio.h>
int main()
{
static int i = 0 ;
if( i++==0 ? main(): 1)
printf("Hello,");
else
printf("World\n");
return 0 ;
}
estampas Hello, World
Apertem os cintos de segurança:
#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;
}
Impressões:
if executed
else executed
É isto que você quer dizer?Duvido, mas pelo menos é possível.Usando fork
você também pode fazer isso, mas as ramificações serão executadas em processos diferentes.
Se estiver no Unix:
if (fork())
printf ("Hello");
else
printf("World");
É claro que isso não garante a ordem das impressões
#define CONDITION (0) if (0) {} else
ou algo assim.
Se você vir essa pergunta em uma entrevista, fuja o mais rápido que puder!A equipe que faz essas perguntas certamente não será saudável.
Editar - esqueci de esclarecer - isso depende de "else" ser correspondido com o "if" aberto mais próximo e do fato de estar escrito como "if CONDITION" em vez de if (CONDITION) - parênteses tornariam o quebra-cabeça insolúvel.
if ( printf("Hello")==0)
ver [http://www.coders2020.com/what-does-printf-return]
(matt corrigiu meu =, obrigado, C está longe)
O if
instrução executa uma ou outra das instruções controladas (ambas printf
no seu exemplo).Não importa para que você use condition
, esse trecho imprimirá "Hello" ou "World", mas nunca ambos.
Editar:Ok, então é uma pergunta capciosa e você pode colocar o que quiser na condição (incluindo uma chamada para uma outra função inteira que faz o que você quiser).Mas isso não é interessante.Não acredito que fui prejudicado por dar uma resposta correta.
Comente o "else" ;)
if(foo)
{
bar();
}
//else
{
baz();
}
Sem saber o valor de retorno de printf
em cima da sua cabeça:
if (printf("Hello") && 0)
printf("Hello");
else
printf("World");
A resposta básica é que, no curso normal dos eventos, você não deseja executar ambas as instruções no bloco 'if' e no bloco 'else' em uma única passagem pelo código (por que se preocupar com a condição se o faz) nem pode você executa os dois conjuntos de instruções sem passar por obstáculos grotescos.
Alguns aros grotescos - código maligno!
if (condition == true)
{
...stuff...
goto Else;
}
else
{
Else:
...more stuff...
}
Claro, é um claro abuso de (qualquer) linguagem porque é equivalente a:
if (condition == true)
{
...stuff...
}
...more stuff...
No entanto, pode conseguir o que a pergunta está perguntando.Se você tiver que executar os dois blocos, seja a condição verdadeira ou falsa, as coisas ficarão um pouco mais complicadas.
done_then = false;
if (condition == true)
{
Then:
...stuff...
done_then = true;
goto Else;
}
else
{
Else:
...more stuff...
if (!done_then) goto Then;
}
int main()
{
runIfElse(true);
runIfElse(false);
return 0;
}
void runIfElse(bool p)
{
if(p)
{
// do if
}
else
{
// do else
}
}
if (true) printf ("Hello"); if (false)
printf ("Hello");
else
printf("World");
Não há amor por exit
?
if(printf("HelloWorld"), exit(0), "ByeBye")
printf ("Hello");
else
printf ("World");
Então...você deseja executar o código dentro do bloco if ...e o código dentro do bloco else...da mesma instrução if/else?Então...você deve se livrar do else e colar esse código no if.
if something
do_this
do_that
end
A instrução else foi projetada para ser executada apenas se a instrução if não for executada e vice-versa, esse é o ponto principal.Esta é uma pergunta estranha...
Isso poderia funcionar:
if (printf("Hello") - strlen("Hello"))
printf("Hello")
else
printf("World")
Este trecho enfatiza o valor de retorno de printf
:O número de caracteres impressos.
Basta colocar o código antes ou depois do bloco if..else.
Alternativamente, se você tiver um bloco "if, else if, else" onde deseja executar código em algumas ramificações (mas não todas), basta colocá-lo em uma função separada e chamar essa função dentro de cada bloco.
Solução 1:
int main(int argc, char* argv[])
{
if( argc == 2 || main( 2, NULL ) )
{
printf("Hello ");
}
else
{
printf("World\n");
}
return 0;
}
Solução 2 (somente para Unix e Linux):
int main(int argc, char* argv[])
{
if( !fork() )
{
printf("Hello ");
}
else
{
printf("World\n");
}
return 0;
}
#include<stdio.h>
int main()
{
if(! printf("Hello"))
printf ("Hello");
else
printf ("World");
return 0;
}
Porque Printf retorna o número de caracteres que foram impressos com sucesso.
if(printf("Hello") == 1)
printf("Hello")
else
printf("World")
if (printf("Hello") < 1)
printf("Hello");
else
printf("World");
Greg escreveu:
Não importa qual condição você use, esse trecho imprimirá "Hello" ou "World", mas nunca ambos.
Bem, isso não é verdade, mas por que você faria isso? querer para imprimir ambos, não consigo encontrar um caso de uso para.Está anulando o objetivo de ter uma instrução if.A provável solução "real" é não usar nenhum caso.Perguntas bobas da entrevista...:)
Pessoal muito interessante, obrigado pelas respostas.Eu nunca teria pensado em colocar a instrução print dentro da condição if.
Aqui está o equivalente em Java:
if ( System.out.printf("Hello").equals("") )
System.out.printf("Hello");
else
System.out.printf("World");
Não use um bloco if else then.
EDITAR para comentar.
Isso pode significar que o código está em ambos os blocos ou antes/depois do bloco, se for necessário executar em ambos os casos.
use goto, uma das palavras-chave mais subutilizadas de nossos dias
Cheeting com uma instrução else vazia:
if (condition)
// do if stuff
else;
// do else stuff
Se você não gosta do outro fato;é na verdade uma instrução else vazia, tente isto:
for (int ii=0; ii<2; ii++)
{
if (condition && !ii)
// do if stuff
else
{
// do else stuff
break;
}
}
Duas soluções possíveis sem usar instruções printf: -
Primeiro :-
#include <stdio.h>
int
main(void)
{
if (!stdin || (stdin = 0, main()))
printf("hello");
else
printf("world");
return 0;
}
Segundo
#include<stdio.h>
void main()
{
if (1
#define else if (1)
)
{
printf("hello");
}
else
{
printf("world");
}
}
if (printf("hello") & 0)
{
printf("hello");
}
else
{
printf("world");
Não há necessidade de se preocupar com o valor de retorno de printf.
Abuso de pré-processamento - pelo menos com limpeza.
#define else
if(1)
{
printf("hello");
}
else
{
printf("world");
}
#undef else
A condição para esta pergunta é:
if(printf("hello")? 0 : 1) { }