A resposta óbvia é usar 500 chamadas printfe imprimir dois números de cada vez, não?
James McNellis
433
printf ("números de 1 a 1000");
jondavidjohn
7
:?não é uma declaração condicional (é uma expressão) ...
Chris Lutz
127
A entrevista é sua chance de brilhar. Diga a eles "Sem loops ou condicionais? Brincadeira de criança. Eu posso fazer isso sem um computador!" Em seguida, retire a caneta e o bloco de notas. Eles podem parecer confusos, mas apenas explique que, se você não pode contar com construções de linguagem incorporadas, não pode assumir nada.
JohnFx
8
Pessoalmente, acho que havia várias respostas que tinham soluções inteligentes e interessantes. Eu também acho que, embora essa possa ser facilmente uma péssima pergunta para uma entrevista, poderia ter um bom valor, desde que o entrevistador realmente não busque tanto uma solução completamente bem formada quanto se o entrevistado considerou abordagens que indiquem conhecimento de TMP ou uso de construções de maneiras incomuns. Eu acho que seria ruim se isso fosse usado como uma pergunta pura 'entendi certo / errado', mas se fosse usado como ponto de partida de uma discussão, eu poderia ver muito valor.
Michael Burr
Respostas:
785
Recursão em tempo de compilação! : P
#include<iostream>template<int N>structNumberGeneration{staticvoidout(std::ostream& os){NumberGeneration<N-1>::out(os);
os << N << std::endl;}};template<>structNumberGeneration<1>{staticvoidout(std::ostream& os){
os <<1<< std::endl;}};int main(){NumberGeneration<1000>::out(std::cout);}
Alguém pode me explicar como isso funciona? bastante impressionante.
Gate
28
@Zack: Vamos ser realistas, estamos imprimindo 1.000 linhas de um programa escrito para evitar deliberadamente loops. O desempenho não é um problema.
dreamlax
42
Para aqueles curiosos o suficiente para compilar isso: em g ++, defina -ftemplate-depth-1000. O máximo de recursão do modelo padrão é 500.
Tom
6
Isso ainda usa condicionais: a correspondência de padrões é glorificada se.
David K.
10
@dreamlax: É apenas uma daquelas coisas que aprendi com a experiência ao longo dos anos: use a '\n'menos que queira realmente liberar, use a ++imenos que você realmente precise do valor anterior i, passe por constreferência, a menos que você tenha um bom motivo para não ... Quando os desenvolvedores param de pensar neles (ou nunca começam), eles, mais cedo ou mais tarde, enfrentam um problema onde isso importa, mas eles nem sabiam que havia pontos em que isso poderia importar.
Sbi
1195
Na verdade, este compila um assembly que não possui condicionais:
Bem, o código nesta resposta obviamente não é nem C nem C ++, então isso é bom apenas se descartarmos o requisito. Qualquer resposta pode ser qualificada porque um compilador hipotético pode apenas produzir o programa necessário a partir de qualquer entrada.
EQ-
321
@PP, isso é bastante demorado para explicar, mas basicamente jé inicialmente 1porque é realmente argc, ou seja, 1se o programa for chamado sem argumentos. Então, j/1000é 0até jse torna 1000, após o que é 1. (exit - main)é, obviamente, a diferença entre os endereços de exit()e main(). Isso significa que (main + (exit - main)*(j/1000))é main()até jse tornar 1000, após o que se torna exit(). O resultado final main()é chamado quando o programa é iniciado e, em seguida, chama-se recursivamente 999 vezes enquanto incrementa je depois chama exit(). Ufa :)
Frédéric Hamidi
7
Este é um dos abusos mais surpreendentes que a CI já viu. Mas isso funcionará em todas as plataformas?
Qwertie
13
@ Mark: esta é uma assinatura não padrão do main, você não pode chamar o main recursivamente, e o resultado da subtração de ponteiros de função é indefinido.
Yakov Galka
9
Sim, sim, não é um código C ++ estritamente legal pelas razões que @ybungalobill fornece, mas eu tenho que marcar com +1 por pura insanidade e pelo fato de compilar e trabalhar em algumas plataformas. Há momentos em que a resposta correta para "Mas não é padrão!" é "Quem se importa!" :)
As pessoas postaram isso. As outras versões passam o número para imprimir em vez de usar um global, mas é essencialmente a mesma solução.
Chris Lutz
1
@ Chris, eles usam a mesma lógica expressa em macros ou modelos, ampliando o tamanho do código, certo? Você também pode gerar a própria sequência de saída em vez de mil printfs.
Darius Bacon
Ah, sim, vejo que a resposta de Keith gera toda a sequência, legal. :) Eu senti falta disso.
Darius Bacon
43
Bem, bom esforço, mas um pouco estranho que você não se decompôs 8 em 2 * 2 * 2 e, portanto, usar o factorisation nobre única
@Johannes, na verdade, tenho certeza que printftem um loop: p
icecrime
1
@litb: Note que eu não disse que "usar copyé trapacear"
John Dibling
2
@ John: copiar é trapaça. você duvida? : P
Nawaz 02/01
1
em uma escala de 1 a 10, qual a chance de eu estar usando binário?
Jordânia
270
Aqui estão três soluções que eu conheço. O segundo pode ser discutido.
// compile time recursiontemplate<int N>void f1(){
f1<N-1>();
cout << N <<'\n';}template<>void f1<1>(){
cout <<1<<'\n';}// short circuiting (not a conditional statement)void f2(int N){
N &&(f2(N-1), cout << N <<'\n');}// constructors!struct A {
A(){staticint N =1;
cout << N++<<'\n';}};int main(){
f1<1000>();
f2(1000);delete[]new A[1000];// (3)
A data[1000];// (4) added by Martin York}
[ Edit: (1) e (4) pode ser usado apenas para constantes de tempo de compilação, (2) e (3) também podem ser usados para expressões em tempo de execução - edição final. ]
Além disso, eu argumentaria que um curto-circuito não é condicional ... Não é uma afirmação, é verdade, mas uma expressão condicional, eu diria. Desde que definamos uma expressão condicional como "algo que produz saltos condicionais no assembler".
Kos
5
Pergunta que me ocorreu ao ler o construtor: O padrão exige que cada item na matriz seja construído em sequência? Seria importante se o construtor tivesse efeitos colaterais. Eu tenho certeza que cada sãs implementos compilador-lo como um loop 0-> 1000, mas gostaria de saber se você poderia ainda estar em conformidade e para trás laço ...
Joseph Garvin
6
@ Joseph - O construtor não deve ser afetado pela ordem em que os objetos individuais são iniciados, mas é uma boa pergunta.
Chris Lutz
12
@ Joseph, isso é definido por 12.6 / 3 (C ++ 03). A inicialização é feita em ordem de assinatura.
Johannes Schaub - litb
2
@Joseph: E eles estão destruídos na ordem inversa também, então você poderia usar um destruidor tão facilmente :)
j_random_hacker
263
Não estou escrevendo a declaração printf 1000 vezes!
meu favorito depois de 'printf ("números de 1 a 1000")' - perguntas tolas exigem respostas tolas.
SEngstrom
isso é incrível. +1 para tirar proveito da ambiguidade na pergunta. haha
Nawaz 02/01
2
Editado; de nenhuma maneira, forma ou formulário fez este código print "Print numbers from 1 to 1000."- questão ambígua para a vitória, descrições imprecisas chupar :)
sehe
Uau, ultimamente tem havido um pouco de vandalismo nas respostas desta pergunta. Algo me diz que devemos atualizar esse bloqueio para um histórico.
BoltClock
172
Acione um erro fatal! Aqui está o arquivo countup.c:
você deve chamar fflush (stdout); após cada printf () ... Quando um programa falha, não é garantido que o buffer de saída seja impresso na tela.
Zakk
10
@zakk: Isso não é estritamente necessário - por padrão, o stdout é buffer de linha, portanto \nserá suficiente para liberar a saída.
Psmears
24
stdout é buffer de linha se puder ser determinado como um dispositivo interativo , caso contrário, é totalmente bufferizado. Se o professor redirecionar o stdout para um arquivo para verificação automatizada, você irá falhar :-) #
385
perigo de stackoverflow (por exemplo, num ambiente incorporado)
Alta chance /usr/bin/sequsa um loop internamente. :)
@jokester: você quer dizer, porque o Solaris / BSD não possui um sequtilitário (na configuração padrão)? <grin />
sehe 26/10
Eu odeio dizer isso (bem, não, não sei), mas há um erro na sua solução. Não imprime o conjunto certo de números. :) Aqui está a correção: system("/bin/echo {1..1000}"); se você tivesse escrito o teste de unidade primeiro ...
Don Branson
1
Um cara brilhante decidiu mudar minha resposta, então esse não é o meu erro.
o requisito é "sem condicionais" (if, switch, etc). não "sem condições"
jon_darkstar 31/12/10
32
<não é uma condição. É um operador relacional. if/ elseé uma declaração condicional. ?:é um operador condicional. <é apenas um operador que retorna um valor booleano. Provavelmente é uma instrução de máquina única, sem saltos ou qualquer coisa.
Chris Lutz
12
@ Chris Lutz: Em x86, é 3 Instruções: cmpl, setle, e movzbl. x86-64 é isso mais um cltq. PowerPC é de 2 instruções: cmpwie crnot.
Adam Rosenfield
4
1 - i / 1000. Sem comparações!
Thai
96
Um pouco chato em comparação com os outros aqui, mas provavelmente o que eles estão procurando.
Tornou mais curto. defina i = 1 fora do main e depois dentro do main: printf ("% d \ n", 11 - i) && --i && main (i);
jftuga
3
@ Jens Schauder: Aproveitando a &&avaliação preguiçosa na primeira linha de f().
Rafał Dowgird
10
Isso não é chato, é simples. Se você pode fazer a mesma coisa com uma pequena função que você puder com uma grande confusão de magia modelo, então você deve fazê-lo com a função :)
amertune
21
O && é uma condição. Um AND matemático avaliará os dois lados (como o Java & e o Ada "AND" faz). && avaliará o segundo operador apenas se (aqui está) o primeiro for verdadeiro. Ou outro exemplo: em Ada, o operador de curto-circuito é chamado "OR THEN" - usando THEN para indicar o aspecto condicional. Desculpe, você poderia ter usado tão bem o? : operador.
Martin
Não precisa se desculpar. && é um operador de comparação. O operador ternário é uma condicional.
Aaron
71
A tarefa nunca especificou que o programa deve terminar após 1000.
Só pode ser reduzido se você eliminar o requisito de C ou C ++. Então qualquer "programa" funcionará, porque um compilador teórico pode gerar o programa que você deseja (a partir de qualquer entrada).
EQ-
@eq Novamente, isso compila e roda muito bem ...
Mark McDonald
72
Como uma reflexão tardia: podemos até fugir da matemática aparente . Se empregarmos rand(), imprimiremos todos os números de 1 a 1000. Eventualmente =: P
5
@pooh: Não necessariamente, já que rand () tem a chance de repetir após determinada seqüência, e que a seqüência pode ser não cair no conjunto solução para este problema
dchhetri
71
Fácil como torta! : P
#include<iostream>staticint current =1;structprint{print(){ std::cout << current++<< std::endl;}};int main(){print numbers [1000];}
você pode querer fazer "int estática atual = 0" caso contrário irá imprimir a partir de 2 a 1001.
Shinnok
i mudou atual ++ a atual ++
Zelix
65
#include<stdio.h>#defineOut(i) printf("%d\n", i++);#define REP(N) N N N N N N N N N N
#defineOut1000(i) REP(REP(REP(Out(i))));void main(){int i =1;Out1000(i);}
Podemos lançar 1000 linhas, cada uma imprimindo um dos números. Instale o OpenMPI , compile usando mpicxx -o 1000 1000.cppe execute usando mpirun -np 1000 ./1000. Você provavelmente precisará aumentar seu limite de descritor usando limitou ulimit. Observe que isso será bastante lento, a menos que você tenha muitos núcleos!
Loop implícito na biblioteca? Mas +1 de qualquer maneira para uma nova abordagem.
Chris Lutz
11
@ Chris Não a maioria das soluções tem um loop oculto em algum lugar?
moinudin
Suponho que, se você adotar a abordagem "loops no compilador". Como (fora de um possível loop sobre os argumentos em MPI::Init()) não consigo imaginar loops no binário real do seu programa 1000.cpp, dei um +1, mesmo que certamente haja loops em execução quando você o executa.
Chris Lutz
40
Com C simples:
#include<stdio.h>/* prints number i */void print1(int i){
printf("%d\n",i);}/* prints 10 numbers starting from i */void print10(int i){
print1(i);
print1(i+1);
print1(i+2);
print1(i+3);
print1(i+4);
print1(i+5);
print1(i+6);
print1(i+7);
print1(i+8);
print1(i+9);}/* prints 100 numbers starting from i */void print100(int i){
print10(i);
print10(i+10);
print10(i+20);
print10(i+30);
print10(i+40);
print10(i+50);
print10(i+60);
print10(i+70);
print10(i+80);
print10(i+90);}/* prints 1000 numbers starting from i */void print1000(int i){
print100(i);
print100(i+100);
print100(i+200);
print100(i+300);
print100(i+400);
print100(i+500);
print100(i+600);
print100(i+700);
print100(i+800);
print100(i+900);}int main(){
print1000(1);return0;}
Obviamente, você pode implementar a mesma idéia para outras bases (2: print2 print4 print8 ...), mas o número 1000 aqui sugeriu a base 10. Você também pode reduzir um pouco o número de linhas adicionando funções intermediárias: print2() print10() print20() print100() print200() print1000()e outras alternativas equivalentes.
Por que o número 1000 sugere a base 10? Em qualquer notação posicional com base B, 1000 é um número perfeitamente válido e sempre é igual B^3.
Philip
Eu apenas quis dizer que, considerando como o número é representado na base 10, a fatoração "10x10x10" se sugeria, mas que outras alternativas são possíveis. Eu acho que eu deveria ter dito "fatoração" em vez de "base"
leonbloy
34
Basta usar std :: copy () com um iterador especial.
Eu acho que seu código começa em 0. Também concordo com Chris, a pergunta como a vi anos atrás foi declarada como "sem nenhuma biblioteca, exceto IO". ainda +1 :)
Yakov Galka
3
@ Chris Lutz: A implementação da cópia é indefinida. Eu posso até usar o código do modelo como acima (você simplesmente não sabe). Então você não pode dizer que usa um loop porque não sabemos.
Martin York
7
Na verdade, minha nit pick não seria o loop implícito std::copytanto quanto o condicional implícito no operator !=(). Independentemente disso, é uma visão inteligente do processamento de um intervalo, e abordagens inteligentes é o que eu procuro em resposta a perguntas como essa.
Michael Burr
implementação específica é indefinida
selvaiyyamperumal 28/11/11
@selvaiyyamperumal: Não sei exatamente do que você está falando. Mas se você está falando sobre comportamento, o padrão não concorda com você. "Comportamento definido pela implementação" significa que está bem definido, mas deve ser explicitamente documentado pela implementação. "Comportamento indefinido" significa que tudo pode acontecer.
Martin York
33
Função ponteiro (ab) uso. Nenhuma mágica do pré-processador para aumentar a saída. ANSI C.
#include<stdio.h>int i=1;void x10(void(*f)()){
f(); f(); f(); f(); f();
f(); f(); f(); f(); f();}void I(){printf("%i ", i++);}void D(){ x10( I );}void C(){ x10( D );}void M(){ x10( C );}int main(){
M();}
Era nisso que eu estava pensando. Uma pessoa anterior disse que 5 * 5 * 5 * 8 = 1000. Eu pensei que era engraçado ele sentir falta dos 10 ^ 3 óbvios. Ótima solução!
Evan Moran
32
#include<iostream>#include<iterator>usingnamespace std;int num(){staticint i =1;return i++;}int main(){ generate_n(ostream_iterator<int>(cout,"\n"),1000, num);}
tudo bem, mas por que "void main ()"? maus hábitos raramente vão? : P
Nawaz 02/01
30
@Nawaz: Como esse é um aplicativo da GUI do Windows, não importa. Só chamei de "principal" porque estava pensando em lagostas e com uma ortografia terrível.
Martin
29
Estouro de pilha:
#include<stdio.h>staticvoid print_line(int i){
printf("%d\n", i);
print_line(i+1);}int main(int argc,char* argv[]){//get up near the stack limitchar tmp[8388608-32*1000-196*32];
print_line(1);}
Isto é para uma pilha de 8 MB. Cada chamada de função parece levar cerca de 32 bytes (daí o 32 * 1000). Mas quando eu o executei, cheguei a 804 (daí o 196 * 32; talvez o tempo de execução C tenha outras partes na pilha que você deve deduzir também).
Como observação lateral: tomei a proibição contra condicionais para estender também aos operadores lógicos e relacionais. Se você permitir negação lógica, a chamada recursiva poderá ser simplificada para:
Eu gosto do jeito que você consegue com a mudança de bits. mas com sua simplificação tardia, o que o double bang faz? é bit a bit ou lógico? im perdido e google me pegou andando em círculosfuncs[!!(limit-1)](x+1, limit-1);
jon_darkstar
Eu prefiro ter um único !e alternar os elementos da matriz do ponteiro de função, mas não sei se isso funcionará bem com sua outra loucura.
Chris Lutz
@ Chris: Eu concordo completamente - mas não considerei usar operadores lógicos / de relacionamento até depois da publicação e achei que um patch de linha única seria mais apropriado. Além disso, ele se encaixa um pouco melhor com toda a sensação ofuscada do problema.
Michael Burr
24
Eu sinto que esta resposta será muito simples e fácil de entender.
int print1000(int num=1){
printf("%d\n", num);// it will check first the num is less than 1000. // If yes then call recursive function to printreturn num<1000&& print1000(++num);}int main(){
print1000();return0;}
Sua resposta usa declarações condicionais, que são proibidas de acordo com a pergunta.
stevelove
4
declarações condicionais são se mais etc. Acabei de usar uma operação lógica !! Hpe está claro!
Pappu
2
Mesmo nos seus comentários, você escreveu "Se sim, chame a função recursiva para imprimir". Uma condicional escrita de maneira não óbvia ainda é condicional. O padrão num também é condicional.
Gerry
23
Perdi toda a diversão, todas as boas respostas C ++ já foram publicadas!
Esta é a coisa mais estranha que eu poderia inventar, mas eu não apostaria que é legal o C99: p
#include<stdio.h>int i =1;int main(int argc,char*argv[printf("%d\n", i++)]){return(i <=1000)&& main(argc, argv);}
Outro, com um pouco de trapaça:
#include<stdio.h>#include<boost/preprocessor.hpp>#define ECHO_COUNT(z, n, unused) n+1#define FORMAT_STRING(z, n, unused)"%d\n"int main(){
printf(BOOST_PP_REPEAT(1000, FORMAT_STRING,~), BOOST_PP_ENUM(LOOP_CNT, ECHO_COUNT,~));}
printf
e imprimir dois números de cada vez, não?:?
não é uma declaração condicional (é uma expressão) ...Respostas:
Recursão em tempo de compilação! : P
fonte
'\n'
menos que queira realmente liberar, use a++i
menos que você realmente precise do valor anteriori
, passe porconst
referência, a menos que você tenha um bom motivo para não ... Quando os desenvolvedores param de pensar neles (ou nunca começam), eles, mais cedo ou mais tarde, enfrentam um problema onde isso importa, mas eles nem sabiam que havia pontos em que isso poderia importar.Na verdade, este compila um assembly que não possui condicionais:
Edit: Added '&', por isso considerará o endereço evitando os erros do ponteiro.
Esta versão do anterior no padrão C, uma vez que não depende da aritmética dos ponteiros de função:
fonte
j
é inicialmente1
porque é realmenteargc
, ou seja,1
se o programa for chamado sem argumentos. Então,j/1000
é0
atéj
se torna1000
, após o que é1
.(exit - main)
é, obviamente, a diferença entre os endereços deexit()
emain()
. Isso significa que(main + (exit - main)*(j/1000))
émain()
atéj
se tornar1000
, após o que se tornaexit()
. O resultado finalmain()
é chamado quando o programa é iniciado e, em seguida, chama-se recursivamente 999 vezes enquanto incrementaj
e depois chamaexit()
. Ufa :)Estou surpreso que ninguém parece ter postado isso - eu pensei que era a maneira mais óbvia.
1000 = 5*5*5*8.
fonte
Parece que não precisa usar loops
fonte
copy
é batotaprintf
tem um loop: pcopy
é trapacear"Aqui estão três soluções que eu conheço. O segundo pode ser discutido.
[ Edit: (1) e (4) pode ser usado apenas para constantes de tempo de compilação, (2) e (3) também podem ser usados para expressões em tempo de execução - edição final. ]
fonte
Não estou escrevendo a declaração printf 1000 vezes!
De nada ;)
fonte
$r='printf("'; for (1..1000) { $r.="$_\\n" } $r.='");'; print $r;
Não imprime todos os números, mas "Imprime números de 1 a 1000". Pergunta ambígua para a vitória! :)
fonte
print "Print numbers from 1 to 1000."
- questão ambígua para a vitória, descrições imprecisas chupar :)Acione um erro fatal! Aqui está o arquivo countup.c:
Compile e execute em um prompt de shell:
Isso de fato imprime os números de 1 a 1000, sem loops ou condicionais!
fonte
\n
será suficiente para liberar a saída.Usando comandos do sistema:
fonte
/usr/bin/seq
usa um loop internamente. :)seq
utilitário (na configuração padrão)? <grin />system("/bin/echo {1..1000}");
se você tivesse escrito o teste de unidade primeiro ...Não testado, mas deve ser o padrão C de baunilha:
fonte
<
não é uma condição. É um operador relacional.if
/else
é uma declaração condicional.?:
é um operador condicional.<
é apenas um operador que retorna um valor booleano. Provavelmente é uma instrução de máquina única, sem saltos ou qualquer coisa.cmpl
,setle
, emovzbl
. x86-64 é isso mais umcltq
. PowerPC é de 2 instruções:cmpwi
ecrnot
.1 - i / 1000
. Sem comparações!Um pouco chato em comparação com os outros aqui, mas provavelmente o que eles estão procurando.
fonte
&&
avaliação preguiçosa na primeira linha def()
.A tarefa nunca especificou que o programa deve terminar após 1000.
( Pode ser reduzido para isso se você executar ./a.out sem parâmetros adicionais )
fonte
rand()
, imprimiremos todos os números de 1 a 1000. Eventualmente =: PFácil como torta! : P
fonte
fonte
Podemos lançar 1000 linhas, cada uma imprimindo um dos números. Instale o OpenMPI , compile usando
mpicxx -o 1000 1000.cpp
e execute usandompirun -np 1000 ./1000
. Você provavelmente precisará aumentar seu limite de descritor usandolimit
ouulimit
. Observe que isso será bastante lento, a menos que você tenha muitos núcleos!Obviamente, os números não serão necessariamente impressos em ordem, mas a pergunta não exige que eles sejam solicitados.
fonte
MPI::Init()
) não consigo imaginar loops no binário real do seu programa 1000.cpp, dei um +1, mesmo que certamente haja loops em execução quando você o executa.Com C simples:
Obviamente, você pode implementar a mesma idéia para outras bases (2: print2 print4 print8 ...), mas o número 1000 aqui sugeriu a base 10. Você também pode reduzir um pouco o número de linhas adicionando funções intermediárias:
print2() print10() print20() print100() print200() print1000()
e outras alternativas equivalentes.fonte
B
, 1000 é um número perfeitamente válido e sempre é igualB^3
.Basta usar std :: copy () com um iterador especial.
fonte
std::copy
tanto quanto o condicional implícito nooperator !=()
. Independentemente disso, é uma visão inteligente do processamento de um intervalo, e abordagens inteligentes é o que eu procuro em resposta a perguntas como essa.Função ponteiro (ab) uso. Nenhuma mágica do pré-processador para aumentar a saída. ANSI C.
fonte
fonte
Resposta C feia (desenrolada para apenas um quadro de pilha por potência de 10):
fonte
Estouro de pilha:
Isto é para uma pilha de 8 MB. Cada chamada de função parece levar cerca de 32 bytes (daí o 32 * 1000). Mas quando eu o executei, cheguei a 804 (daí o 196 * 32; talvez o tempo de execução C tenha outras partes na pilha que você deve deduzir também).
fonte
Diversão com ponteiros de função (não é necessário nada disso TMP novo):
Como observação lateral: tomei a proibição contra condicionais para estender também aos operadores lógicos e relacionais. Se você permitir negação lógica, a chamada recursiva poderá ser simplificada para:
fonte
funcs[!!(limit-1)](x+1, limit-1);
!
e alternar os elementos da matriz do ponteiro de função, mas não sei se isso funcionará bem com sua outra loucura.Eu sinto que esta resposta será muito simples e fácil de entender.
fonte
Perdi toda a diversão, todas as boas respostas C ++ já foram publicadas!
Esta é a coisa mais estranha que eu poderia inventar, mas eu não apostaria que é legal o C99: p
Outro, com um pouco de trapaça:
Última idéia, mesma fraude:
fonte
main
resulta em comportamento indefinido, como me lembro.&&
e||
provavelmente se enquadram em "condicionais", uma vez que curto-circuito (como seria?:
).Fácil como torta:
método de execução:
A especificação não diz que a sequência deve ser gerada dentro do código :)
fonte
fonte
fonte
Mais abuso do pré-processador:
Eu me sinto tão sujo; Eu acho que vou tomar banho agora.
fonte
A2()
sem um argumento como esse?Se soluções POSIX forem aceitas:
fonte
Como não há restrição para erros ..
Ou ainda melhor (?),
fonte
volatile
à declaração dej