在没有循环或条件的情况下打印1到1000

Sau*_*ale 323 c c++ printf

任务:打印数字从1到1000,不使用任何循环或条件语句.不要只写1000次printf()cout语句.

你会怎么用C或C++做到这一点?

Bil*_*ill 1196

这个实际上编译为没有任何条件的程序集:

#include <stdio.h>
#include <stdlib.h>

void main(int j) {
  printf("%d\n", j);
  (&main + (&exit - &main)*(j/1000))(j+1);
}
Run Code Online (Sandbox Code Playgroud)


编辑:添加'&',因此它将考虑地址,从而避免指针错误.

这个版本的上面标准C,因为它不依赖于函数指针上的算术:

#include <stdio.h>
#include <stdlib.h>

void f(int j)
{
    static void (*const ft[2])(int) = { f, exit };

    printf("%d\n", j);
    ft[j/1000](j + 1);
}

int main(int argc, char *argv[])
{
    f(1);
}
Run Code Online (Sandbox Code Playgroud)

  • @PP,解释起来相当冗长,但基本上,`j`最初是'1',因为它实际上是`argc`,如果程序是在没有参数的情况下调用的话,那么它是`1`.然后,`j/1000`是'0`直到`j`变为'1000`,之后它是'1`.`(exit - main)`当然是`exit()`和`main()`的地址之间的区别.这意味着`(main +(exit - main)*(j/1000))`是`main()`直到`j`变为`1000`,之后变为`exit()`.最终结果是在程序启动时调用`main()`,然后在递增`j`时递归调用999次,然后调用`exit()`.哇:) (321认同)
  • 好吧,这个答案中的代码显然既不是C也不是C++,所以只有当我们废弃这个要求时才会这样.然后任何答案都可能有资格,因为假设的编译器可能只是从任何输入产生所需的程序. (17认同)
  • 我真的很想解释它是如何以及为什么有效的,我自己...... (16认同)
  • @Mark:这是main的非标准签名,你不允许以递归方式调用main,并且减去函数指针的结果是未定义的. (13认同)
  • 是的,是的,由于@ybungalobill给出的原因,它不是严格合法的C++代码,但我必须为纯粹的疯狂+1而且它确实在几个平台上编译和工作.有时候对"但它不标准"的正确回应!是"谁在乎!" :) (9认同)
  • 这是CI史上最令人惊讶的滥用行为之一.但它会在所有平台上运行吗? (7认同)
  • @Qwertie:您应该阅读国际混淆的C条目!无论如何,一些编译器可能会对main的原型感到迂腐. (4认同)
  • @Sriram:添加`&`对代码的合法性没有任何影响. (2认同)
  • @caf'&'实际上对语义没有任何影响,但希望避免一些指针错误.至少在我的情况下,我使用tcc来尝试代码并添加'&'使其运行. (2认同)

Pra*_*rav 785

编译时间递归!:P

#include <iostream>
template<int N>
struct NumberGeneration{
  static void out(std::ostream& os)
  {
    NumberGeneration<N-1>::out(os);
    os << N << std::endl;
  }
};
template<>
struct NumberGeneration<1>{
  static void out(std::ostream& os)
  {
    os << 1 << std::endl;
  }
};
int main(){
   NumberGeneration<1000>::out(std::cout);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些好奇的人来编译这个:在g ++中,设置-ftemplate-depth-1000.默认模板递归最大值为500. (42认同)
  • @Zack:让我们变得真实,我们从编写的程序中打印1,000行,故意避免循环.性能不是问题. (28认同)
  • @dreamlax:这只是我多年来从经验中学到的东西之一:除非你真的想要冲洗,否则使用`'\n'`,除非你真的需要`i`的前值,否则使用`++ i`,通过`const`引用,除非你有充分的理由不......当开发人员不再考虑这些(或者甚至从未开始)时,他们迟早会遇到一个问题,只有他们没有甚至知道有可能重要的地方. (10认同)
  • 有人可以向我解释这是如何工作的吗?相当令人印象 (8认同)
  • 这仍然使用条件:模式匹配是一个美化的if. (6认同)
  • 整齐.最重要的是,很明显他会帮助完成他的作业.:-) (5认同)
  • @dreamlax:这是我希望我们可以对评论进行投票的情况之一.这是一个模板元程序,它将在编译时由编译器执行.由此产生的运行时程序除了打印1000个数字之外什么也没做,所以输出的__performance实际上只是重要的___,因为在编译之后没有剩下的东西而是输出. (4认同)
  • 你应该使用`<<'\n'`而不是`<< std :: endl`来避免不必要的缓冲区刷新.(是的,这在使用DOS换行符的系统上正常工作.) (3认同)
  • @ davidk01:"loop"和"conditional"的正常定义是指在运行时而不是编译时发生的操作,并且此代码没有这些.编译器生成的代码将100%免于`CMP`和条件跳转指令. (2认同)
  • @sbi:所施加的限制是它只需要在没有循环或条件的情况下打印数字1到1,000,它没有提到程序执行速度或允许的流刷新次数.使用`'\n'`而不是`std :: endl`实际上并没有那么有用. (2认同)
  • @gath:这是一个带有混合函数调用的模板元程序.重要的是递归模板实例化.注意,每个`NumberGeneration <N>`将实例化`NumberGeneration <N-1>`(并调用其输出函数).这将在编译器爆炸之前完成,除了特化"NumberGeneration <1>"不实例化任何进一步的模板,因此停止递归.基本上,模板特化用于编译时`if`.[这篇着名的文章](http://erdani.com/publications/traits.html)由Alexandrescu详细解释了这项技术的基础知识. (2认同)
  • @dreamlax:当然这个问题没有说明速度要求.但是_if_我们谈的是速度,输出是最重要的,因为在运行时,这个程序除了输出之外什么都不做.我同意@Zack,因为Zack给出的理由,Prasoon应该使用''\n'.不经意地使用`std :: endl`是我经常看到的常见习惯.我曾经有一个同事花了几天时间试图找出程序输出速度差的原因,直到我指向许多`std :: endl`调用.更换它们加速了应用程序约6-8倍.从那时起我就一直关注他们. (2认同)
  • @Jonathan:我认为你所指的是流的_tying_.`std :: cout`是_tied_到`std :: cin`所以,在`std :: cin`等待用户输入之前`std :: cout`将被刷新.我没有密切关注它的任何实现,但我认为只是:任何_input_操作都会触发输出的刷新. (2认同)

Dar*_*con 544

#include <stdio.h>
int i = 0;
p()    { printf("%d\n", ++i); }
a()    { p();p();p();p();p(); }
b()    { a();a();a();a();a(); }
c()    { b();b();b();b();b(); }
main() { c();c();c();c();c();c();c();c(); return 0; }
Run Code Online (Sandbox Code Playgroud)

我很惊讶似乎没有人发布这个 - 我认为这是最明显的方式. 1000 = 5*5*5*8.

  • 嗯,很好的努力,但奇怪的是你没有将8分解为2*2*2,因此使用独特的素因子分解 (43认同)

Joh*_*itb 298

看起来它不需要使用循环

printf("1 10 11 100 101 110 111 1000\n");
Run Code Online (Sandbox Code Playgroud)

  • @Johannes实际上我很确定`printf`有一个循环:p (13认同)
  • @John:复制*是*作弊.你怀疑吗?:P (2认同)

ybu*_*ill 270

以下是我所知道的三种解决方案.第二个可能是有争议的.

// compile time recursion
template<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() {
        static int N = 1;
        cout << N++ << '\n';
    }
};

int main()
{
    f1<1000>();
    f2(1000);
    delete[] new A[1000]; // (3)
    A data[1000]; // (4) added by Martin York
}
Run Code Online (Sandbox Code Playgroud)

[ 编辑:(1)和(4)只能用于编译时常量,(2)和(3)也可用于运行时表达式 - 结束编辑.]

  • @Joseph这是由12.6/3(C++ 03)定​​义的.初始化按订阅顺序完成. (12认同)
  • @Joseph - 构造函数不应受单个对象启动顺序的影响,但这是一个很好的问题. (6认同)
  • 此外,我认为短路不是一个有条件的...不是一个陈述,是真的,而是一个条件表达式,我会说.如果我们将条件表达式定义为"在汇编程序中产生条件跳转的东西". (5认同)
  • @Kos:这不是标准的C++. (5认同)
  • 在阅读构造函数时遇到的问题一:标准是否要求按顺序构造数组中的每个项目?如果构造函数有副作用,那就很重要了.我确信每个理智的编译器都将它实现为0-> 1000循环,但我想知道你是否仍然可以兼容并循环向后... (5认同)
  • @Joseph:它们也以相反的顺序被破坏,所以你可以像使用析构函数一样容易:) (2认同)

Mar*_*rau 263

我没有写1000次printf语句!

printf("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n501\n502\n503\n504\n505\n506\n507\n508\n509\n510\n511\n512\n513\n514\n515\n516\n517\n518\n519\n520\n521\n522\n523\n524\n525\n526\n527\n528\n529\n530\n531\n532\n533\n534\n535\n536\n537\n538\n539\n540\n541\n542\n543\n544\n545\n546\n547\n548\n549\n550\n551\n552\n553\n554\n555\n556\n557\n558\n559\n560\n561\n562\n563\n564\n565\n566\n567\n568\n569\n570\n571\n572\n573\n574\n575\n576\n577\n578\n579\n580\n581\n582\n583\n584\n585\n586\n587\n588\n589\n590\n591\n592\n593\n594\n595\n596\n597\n598\n599\n600\n601\n602\n603\n604\n605\n606\n607\n608\n609\n610\n611\n612\n613\n614\n615\n616\n617\n618\n619\n620\n621\n622\n623\n624\n625\n626\n627\n628\n629\n630\n631\n632\n633\n634\n635\n636\n637\n638\n639\n640\n641\n642\n643\n644\n645\n646\n647\n648\n649\n650\n651\n652\n653\n654\n655\n656\n657\n658\n659\n660\n661\n662\n663\n664\n665\n666\n667\n668\n669\n670\n671\n672\n673\n674\n675\n676\n677\n678\n679\n680\n681\n682\n683\n684\n685\n686\n687\n688\n689\n690\n691\n692\n693\n694\n695\n696\n697\n698\n699\n700\n701\n702\n703\n704\n705\n706\n707\n708\n709\n710\n711\n712\n713\n714\n715\n716\n717\n718\n719\n720\n721\n722\n723\n724\n725\n726\n727\n728\n729\n730\n731\n732\n733\n734\n735\n736\n737\n738\n739\n740\n741\n742\n743\n744\n745\n746\n747\n748\n749\n750\n751\n752\n753\n754\n755\n756\n757\n758\n759\n760\n761\n762\n763\n764\n765\n766\n767\n768\n769\n770\n771\n772\n773\n774\n775\n776\n777\n778\n779\n780\n781\n782\n783\n784\n785\n786\n787\n788\n789\n790\n791\n792\n793\n794\n795\n796\n797\n798\n799\n800\n801\n802\n803\n804\n805\n806\n807\n808\n809\n810\n811\n812\n813\n814\n815\n816\n817\n818\n819\n820\n821\n822\n823\n824\n825\n826\n827\n828\n829\n830\n831\n832\n833\n834\n835\n836\n837\n838\n839\n840\n841\n842\n843\n844\n845\n846\n847\n848\n849\n850\n851\n852\n853\n854\n855\n856\n857\n858\n859\n860\n861\n862\n863\n864\n865\n866\n867\n868\n869\n870\n871\n872\n873\n874\n875\n876\n877\n878\n879\n880\n881\n882\n883\n884\n885\n886\n887\n888\n889\n890\n891\n892\n893\n894\n895\n896\n897\n898\n899\n900\n901\n902\n903\n904\n905\n906\n907\n908\n909\n910\n911\n912\n913\n914\n915\n916\n917\n918\n919\n920\n921\n922\n923\n924\n925\n926\n927\n928\n929\n930\n931\n932\n933\n934\n935\n936\n937\n938\n939\n940\n941\n942\n943\n944\n945\n946\n947\n948\n949\n950\n951\n952\n953\n954\n955\n956\n957\n958\n959\n960\n961\n962\n963\n964\n965\n966\n967\n968\n969\n970\n971\n972\n973\n974\n975\n976\n977\n978\n979\n980\n981\n982\n983\n984\n985\n986\n987\n988\n989\n990\n991\n992\n993\n994\n995\n996\n997\n998\n999\n1000\n");
Run Code Online (Sandbox Code Playgroud)

别客气 ;)

  • 我希望你写了一个程序来生成那一行. (223认同)
  • 我希望您编写的用于生成该行的程序不包含循环! (53认同)
  • open("1000.c","w").write('printf("%s");'%("\n".join([str(x)for x in xrange(1,1000)]) )) (32认同)
  • Vim宏可以快速完成工作. (20认同)
  • 一些Perl以一种奇特的方式生成它:`$ r ='printf("'; for(1..1000){$ r.="$ _ \\n"} $ r.='");' ; print $ r;` (2认同)

Mat*_*hen 213

printf("%d\n", 2);
printf("%d\n", 3);
Run Code Online (Sandbox Code Playgroud)

它不会打印所有数字,但会打印"从1到1000打印数字".赢得暧昧的问题!:)

  • 我最喜欢的'printf("数字从1到1000")' - 愚蠢的问题需要愚蠢的答案. (77认同)
  • 编辑; 在任何情况下,形状或形式没有这个代码"打印"打印数字从1到1000."` - 模糊的问题的胜利,不准确的描述吮吸:) (2认同)

小智 172

触发致命错误!这是文件countup.c:

#include <stdio.h>
#define MAX 1000
int boom;
int foo(n) {
    boom = 1 / (MAX-n+1);
    printf("%d\n", n);
    foo(n+1);
}
int main() {
    foo(1);
}
Run Code Online (Sandbox Code Playgroud)

编译,然后在shell提示符下执行:

$ ./countup
1
2
3
...
996
997
998
999
1000
Floating point exception
$
Run Code Online (Sandbox Code Playgroud)

这确实打印了从1到1000的数字,没有任何循环或条件!

  • 你应该叫fflush(stdout); 在每个printf()之后...当程序崩溃时,不能保证输出缓冲区将在屏幕上打印. (43认同)
  • stdout是行缓冲的_如果它可以被确定为交互式设备_,否则它是完全缓冲的.如果教授将stdout重定向到文件进行自动检查,您将失败:-) (24认同)
  • @zakk:这不是绝对必要的 - 默认情况下stdout是行缓冲的,所以`\n`足以刷新输出. (10认同)

mar*_*cog 166

使用系统命令:

system("/usr/bin/seq 1000");
Run Code Online (Sandbox Code Playgroud)

  • 很高的机会`/ usr/bin/seq`在内部使用循环.:) (15认同)

mun*_*ent 100

未经测试,但应该是香草标准C:

void yesprint(int i);
void noprint(int i);

typedef void(*fnPtr)(int);
fnPtr dispatch[] = { noprint, yesprint };

void yesprint(int i) {
    printf("%d\n", i);
    dispatch[i < 1000](i + 1);
}

void noprint(int i) { /* do nothing. */ }

int main() {
    yesprint(1);
}
Run Code Online (Sandbox Code Playgroud)

  • `<`不是条件.它是一个关系运算符.`if` /`else`是条件语句.`?:`是一个条件运算符.`<`只是一个返回布尔值的运算符.它可能是一个没有跳跃或任何东西的单一机器指令. (32认同)
  • @Prasoon:这是一种关系. (29认同)
  • 要求是"无条件"(如果,转换等).不是"没有条件" (28认同)
  • @munificent:`i <= 1000`是一个条件. (21认同)
  • @Chris Lutz:在x86上,它是3个指令:`cmpl`,`setle`和`movzbl`.x86-64加上一个`cltq`.PowerPC是2条指令:`cmpwi`和`crnot`. (12认同)
  • `1 - i/1000`.没有比较! (4认同)
  • 关于`i <1000`没有任何争议.它不再是`-`的条件:没有流量控制或短路. (3认同)
  • 如果使用`i <1000`是有争议的,你可以使用另一个间接.添加`static int jeez [1001]; jeez [1000] = 1;`并用`1 - jeez [i]`替换`i <1000`.(静态数组初始化为零.) (2认同)

小智 96

与其他人相比有点无聊,但可能是他们正在寻找的东西.

#include <stdio.h>

int f(int val) {
    --val && f(val);
    return printf( "%d\n", val+1);
}

void main(void) {
    f(1000);
}
Run Code Online (Sandbox Code Playgroud)

  • &&是有条件的.数学和将评估双方(如Java&和Ada"AND").&&将仅评估第二个运算符**如果**(这里是)第一个是真的.或者其他例子:在Ada中,短路运算符被称为"或那么" - 使用THEN来表示条件方面.对不起,您可以使用它吗?:运营商. (21认同)
  • 这并不乏味,很简单.如果你可以用一个简短的函数做同样的事情,你可以使用大量的模板魔法,那么你应该用函数:) (10认同)
  • @Jens Schauder:利用`f()`第一行中的懒惰`&&`评估. (3认同)

Bri*_*ian 71

该任务从未指定程序必须在1000之后终止.

void f(int n){
   printf("%d\n",n);
   f(n+1);
}

int main(){
   f(1);
}
Run Code Online (Sandbox Code Playgroud)

(如果你运行./a.out而没有额外的参数,可以缩短到这个)

void main(int n) {
   printf("%d\n", n);
   main(n+1);
}
Run Code Online (Sandbox Code Playgroud)

  • 作为事后的想法:我们甚至可以逃避_apparent_数学.如果我们使用`rand()`,我们将打印所有数字从1到1000.**最终**=:P (72认同)
  • @pooh:不一定,因为rand()有可能在某个序列之后重复,并且该序列可能不会落入此问题的解决方案集中 (5认同)

Zel*_*lix 71

非常简单!:P

#include <iostream>

static int current = 1;

struct print
{
    print() { std::cout << current++ << std::endl; }
};

int main()
{
    print numbers [1000];
}
Run Code Online (Sandbox Code Playgroud)


小智 65

#include <stdio.h>
#define Out(i)       printf("%d\n", i++);
#define REP(N)       N N N N N N N N N N
#define Out1000(i)   REP(REP(REP(Out(i))));
void main()
{
 int i = 1;
 Out1000(i);
}
Run Code Online (Sandbox Code Playgroud)

  • Ummmm.宏.这是什么晚餐. (3认同)

mar*_*cog 42

我们可以启动1000个线程,每个线程打印一个数字.安装OpenMPI,使用编译mpicxx -o 1000 1000.cpp并运行mpirun -np 1000 ./1000.您可能需要使用limit或增加描述符限制ulimit.请注意,这将是相当慢的,除非您有大量的核心!

#include <cstdio>
#include <mpi.h>
using namespace std;

int main(int argc, char **argv) {
  MPI::Init(argc, argv);
  cout << MPI::COMM_WORLD.Get_rank() + 1 << endl;
  MPI::Finalize();
}
Run Code Online (Sandbox Code Playgroud)

当然,这些数字不一定按顺序打印,但问题不需要订购.

  • @Chris大多数解决方案都没有隐藏的循环吗? (11认同)

leo*_*loy 40

用普通C:

#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);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以为其他基础实现相同的想法(2:print2 print4 print8 ...),但这里的数字1000建议基数10.您还可以减少添加中间函数的行数:print2() print10() print20() print100() print200() print1000()和其他等效替代品.


Mar*_*ork 34

只需将std :: copy()与特殊迭代器一起使用即可.

#include <algorithm>
#include <iostream>
#include <iterator>

struct number_iterator
{
    typedef std::input_iterator_tag iterator_category;
    typedef int                     value_type;
    typedef std::size_t             difference_type;
    typedef int*                    pointer;
    typedef int&                    reference;

    number_iterator(int v): value(v)                {}
    bool operator != (number_iterator const& rhs)   { return value != rhs.value;}
    number_iterator operator++()                    { ++value; return *this;}
    int operator*()                                 { return value; }
    int value;
};



int main()
{
    std::copy(number_iterator(1), 
              number_iterator(1001), 
              std::ostream_iterator<int>(std::cout, " "));
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我的单​​挑不是`std :: copy`中的隐式循环,而是`operator!=()`中的隐式条件.无论如何,它是处理范围的聪明方法,而且我在寻找这样的问题时会寻找聪明的方法. (7认同)
  • 我认为`std :: copy`有点接近循环. (4认同)
  • @Chris Lutz:副本的实现未定义.我甚至可以使用上面的模板代码(你只是不知道).所以你不能说它使用循环,因为我们不知道. (3认同)

小智 33

函数指针(ab)使用.没有预处理器魔法来增加输出.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();
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是我的想法.前一个人说5*5*5*8 = 1000.我觉得有趣的是他错过了明显的10 ^ 3.好的解决方案 (3认同)

Dus*_*tin 32

#include <iostream>
#include <iterator>
using namespace std;

int num() { static int i = 1; return i++; }
int main() { generate_n(ostream_iterator<int>(cout, "\n"), 1000, num); }
Run Code Online (Sandbox Code Playgroud)


Mar*_*tin 30

难看的C答案(每10次幂只展开一个堆栈帧):

#define f5(i) f(i);f(i+j);f(i+j*2);f(i+j*3);f(i+j*4)
void f10(void(*f)(int), int i, int j){f5(i);f5(i+j*5);}
void p1(int i){printf("%d,",i);}
#define px(x) void p##x##0(int i){f10(p##x, i, x);}
px(1); px(10); px(100);

void main()
{
  p1000(1);
}
Run Code Online (Sandbox Code Playgroud)

  • @Nawaz:因为这是一个秘密的Windows GUI应用程序,所以没关系.我只称它为"主要",因为我在考虑龙虾并且拼写错误. (30认同)
  • 一切都好,但为什么"void main()"?坏习惯很少去?:P (3认同)

小智 29

堆栈溢出:

#include <stdio.h>

static void print_line(int i)
{   
 printf("%d\n", i); 
 print_line(i+1);
}   

int main(int argc, char* argv[])
{   
 //get up near the stack limit
 char tmp[ 8388608 - 32 * 1000 - 196 * 32 ];
 print_line(1);
} 
Run Code Online (Sandbox Code Playgroud)

这是一个8MB的堆栈.每个函数调用似乎占用大约32个字节(因此32*1000).但是当我运行它时,我只得到804(因此196*32;也许C运行时在堆栈中还有其他部分你必须扣除).


Mic*_*urr 25

功能指针的乐趣(不需要新的TMP):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>


#define MSB(typ) ((sizeof(typ) * CHAR_BIT) - 1)

void done(int x, int y);
void display(int x, int y);

void (*funcs[])(int,int)  = {
    done,
    display
};

void done(int x, int y)
{
    exit(0);
}

void display(int x, int limit)
{
    printf( "%d\n", x);
    funcs[(((unsigned int)(x-limit)) >> MSB(int)) & 1](x+1, limit);
}


int main()
{
    display(1, 1000);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

作为旁注:我还禁止条件限制扩展到逻辑和关系运算符.如果允许逻辑否定,则递归调用可以简化为:

funcs[!!(limit-1)](x+1, limit-1);
Run Code Online (Sandbox Code Playgroud)


Pap*_*ppu 24

我觉得这个答案非常简单易懂.

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 print
    return num<1000 && print1000(++num); 
}

int main()
{
    print1000();
    return 0;        
}
Run Code Online (Sandbox Code Playgroud)

  • 条件语句是if else等我只是使用了逻辑运算!! Hpe很清楚! (4认同)
  • 您的答案使用条件语句,根据问题禁止使用. (3认同)
  • 即使在你的评论中你写了"如果是,则调用递归函数打印".以不明显的方式写的条件仍然是有条件的.num默认值也是条件的. (2认同)

ice*_*ime 23

我错过了所有的乐趣,所有好的C++答案都已经发布了!

这是我能想到的最奇怪的事情,我不会打赌这是合法的C99:p

#include <stdio.h>

int i = 1;
int main(int argc, char *argv[printf("%d\n", i++)])
{
  return (i <= 1000) && main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

另一个,有点作弊:

#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, ~));
}
Run Code Online (Sandbox Code Playgroud)

最后的想法,同样的欺骗:

#include <boost/preprocessor.hpp>
#include <iostream>

int main()
{
#define ECHO_COUNT(z, n, unused) BOOST_PP_STRINGIZE(BOOST_PP_INC(n))"\n"
    std::cout << BOOST_PP_REPEAT(1000, ECHO_COUNT, ~) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 逻辑运算符`&&'和`||`可能属于"条件",因为它们会短路(就像`?:`). (6认同)
  • 这是完全合法的C. @ybungalobill:你必须考虑C++,其中特别禁止调用main(). (4认同)

Rod*_*igo 22

非常简单:

int main(int argc, char* argv[])
{
    printf(argv[0]);
}
Run Code Online (Sandbox Code Playgroud)

执行方法:

printer.exe "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94;95;96;97;98;99;100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115;116;117;118;119;120;121;122;123;124;125;126;127;128;129;130;131;132;133;134;135;136;137;138;139;140;141;142;143;144;145;146;147;148;149;150;151;152;153;154;155;156;157;158;159;160;161;162;163;164;165;166;167;168;169;170;171;172;173;174;175;176;177;178;179;180;181;182;183;184;185;186;187;188;189;190;191;192;193;194;195;196;197;198;199;200;201;202;203;204;205;206;207;208;209;210;211;212;213;214;215;216;217;218;219;220;221;222;223;224;225;226;227;228;229;230;231;232;233;234;235;236;237;238;239;240;241;242;243;244;245;246;247;248;249;250;251;252;253;254;255;256;257;258;259;260;261;262;263;264;265;266;267;268;269;270;271;272;273;274;275;276;277;278;279;280;281;282;283;284;285;286;287;288;289;290;291;292;293;294;295;296;297;298;299;300;301;302;303;304;305;306;307;308;309;310;311;312;313;314;315;316;317;318;319;320;321;322;323;324;325;326;327;328;329;330;331;332;333;334;335;336;337;338;339;340;341;342;343;344;345;346;347;348;349;350;351;352;353;354;355;356;357;358;359;360;361;362;363;364;365;366;367;368;369;370;371;372;373;374;375;376;377;378;379;380;381;382;383;384;385;386;387;388;389;390;391;392;393;394;395;396;397;398;399;400;401;402;403;404;405;406;407;408;409;410;411;412;413;414;415;416;417;418;419;420;421;422;423;424;425;426;427;428;429;430;431;432;433;434;435;436;437;438;439;440;441;442;443;444;445;446;447;448;449;450;451;452;453;454;455;456;457;458;459;460;461;462;463;464;465;466;467;468;469;470;471;472;473;474;475;476;477;478;479;480;481;482;483;484;485;486;487;488;489;490;491;492;493;494;495;496;497;498;499;500;501;502;503;504;505;506;507;508;509;510;511;512;513;514;515;516;517;518;519;520;521;522;523;524;525;526;527;528;529;530;531;532;533;534;535;536;537;538;539;540;541;542;543;544;545;546;547;548;549;550;551;552;553;554;555;556;557;558;559;560;561;562;563;564;565;566;567;568;569;570;571;572;573;574;575;576;577;578;579;580;581;582;583;584;585;586;587;588;589;590;591;592;593;594;595;596;597;598;599;600;601;602;603;604;605;606;607;608;609;610;611;612;613;614;615;616;617;618;619;620;621;622;623;624;625;626;627;628;629;630;631;632;633;634;635;636;637;638;639;640;641;642;643;644;645;646;647;648;649;650;651;652;653;654;655;656;657;658;659;660;661;662;663;664;665;666;667;668;669;670;671;672;673;674;675;676;677;678;679;680;681;682;683;684;685;686;687;688;689;690;691;692;693;694;695;696;697;698;699;700;701;702;703;704;705;706;707;708;709;710;711;712;713;714;715;716;717;718;719;720;721;722;723;724;725;726;727;728;729;730;731;732;733;734;735;736;737;738;739;740;741;742;743;744;745;746;747;748;749;750;751;752;753;754;755;756;757;758;759;760;761;762;763;764;765;766;767;768;769;770;771;772;773;774;775;776;777;778;779;780;781;782;783;784;785;786;787;788;789;790;791;792;793;794;795;796;797;798;799;800;801;802;803;804;805;806;807;808;809;810;811;812;813;814;815;816;817;818;819;820;821;822;823;824;825;826;827;828;829;830;831;832;833;834;835;836;837;838;839;840;841;842;843;844;845;846;847;848;849;850;851;852;853;854;855;856;857;858;859;860;861;862;863;864;865;866;867;868;869;870;871;872;873;874;875;876;877;878;879;880;881;882;883;884;885;886;887;888;889;890;891;892;893;894;895;896;897;898;899;900;901;902;903;904;905;906;907;908;909;910;911;912;913;914;915;916;917;918;919;920;921;922;923;924;925;926;927;928;929;930;931;932;933;934;935;936;937;938;939;940;941;942;943;944;945;946;947;948;949;950;951;952;953;954;955;956;957;958;959;960;961;962;963;964;965;966;967;968;969;970;971;972;973;974;975;976;977;978;979;980;981;982;983;984;985;986;987;988;989;990;991;992;993;994;995;996;997;998;999;1000"
Run Code Online (Sandbox Code Playgroud)

该规范并没有说的顺序必须产生内部的代码:)


Joh*_*ing 18

#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;

class Printer
{
public:
 Printer() { cout << ++i_ << "\n"; }
private:
 static unsigned i_;
};

unsigned Printer::i_ = 0;

int main()
{
 Printer p[1000];
}
Run Code Online (Sandbox Code Playgroud)

  • 基本上与已发布的相同. (9认同)

650*_*502 15

#include <stdio.h>

void nothing(int);
void next(int);
void (*dispatch[2])(int) = {next, nothing};

void nothing(int x) { }
void next(int x)
{
    printf("%i\n", x);
    dispatch[x/1000](x+1);
}

int main()
{
    next(1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


kei*_*hmo 15

更多预处理程序滥用:

#include <stdio.h>

#define A1(x,y) #x #y "0\n" #x #y "1\n" #x #y "2\n" #x #y "3\n" #x #y "4\n" #x #y "5\n" #x #y "6\n" #x #y "7\n" #x #y "8\n" #x #y "9\n"
#define A2(x) A1(x,1) A1(x,2) A1(x,3) A1(x,4) A1(x,5) A1(x,6) A1(x,7) A1(x,8) A1(x,9)
#define A3(x) A1(x,0) A2(x)
#define A4 A3(1) A3(2) A3(3) A3(4) A3(5) A3(6) A3(7) A3(8) A3(9)
#define A5 "1\n2\n3\n4\n5\n6\n7\n8\n9\n" A2() A4 "1000\n"

int main(int argc, char *argv[]) {
    printf(A5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我觉得很脏 我想我现在会洗澡.

  • 你可以在没有这样的论证的情况下调用`A2()`吗? (2认同)

jwe*_*ich 15

如果接受POSIX解决方案:

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
#include <pthread.h>

static void die(int sig) {
    exit(0);
}

static void wakeup(int sig) {
    static int counter = 1;
    struct itimerval timer;
    float i = 1000 / (1000 - counter);

    printf("%d\n", counter++);

    timer.it_interval.tv_sec = 0;
    timer.it_interval.tv_usec = 0;
    timer.it_value.tv_sec = 0;
    timer.it_value.tv_usec = i; /* Avoid code elimination */
    setitimer(ITIMER_REAL, &timer, 0);
}

int main() {
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    signal(SIGFPE, die);
    signal(SIGALRM, wakeup);
    wakeup(0);
    pthread_mutex_lock(&mutex);
    pthread_mutex_lock(&mutex); /* Deadlock, YAY! */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kan 13

由于对bug没有限制..

int i=1; int main() { int j=i/(i-1001); printf("%d\n", i++); main(); }
Run Code Online (Sandbox Code Playgroud)

甚至更好(?),

#include <stdlib.h>
#include <signal.h>

int i=1;
int foo() { int j=i/(i-1001); printf("%d\n", i++); foo(); }

int main()
{
        signal(SIGFPE, exit);
        foo();
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该避免编译器优化,以保持其他未使用的j. (2认同)
  • 他只需要在`j`的声明中添加`volatile` (2认同)

Bil*_*ill 12

#include <stdio.h>

typedef void (*fp) (int);

void stop(int i)
{
   printf("\n");
}

void next(int i);

fp options[2] = { next, stop };

void next(int i)
{
   printf("%d ", i);
   options[i/1000](++i);
}

int main(void)
{
   next(1);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)


小智 11

使用指针算法,我们可以使用自动数组初始化为0.

#include <stdio.h>

void func();
typedef void (*fpa)();
fpa fparray[1002] = { 0 };

int x = 1;
void func() {
 printf("%i\n", x++);
 ((long)fparray[x] + &func)();
}

void end() { return; }

int main() {
 fparray[1001] = (fpa)(&end - &func);
 func();
 return 0;
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 11

对于C++爱好者

int main() {
  std::stringstream iss;
  iss << std::bitset<32>(0x12345678);
  std::copy(std::istream_iterator< std::bitset<4> >(iss), 
            std::istream_iterator< std::bitset<4> >(),
            std::ostream_iterator< std::bitset<4> >(std::cout, "\n")); 
}
Run Code Online (Sandbox Code Playgroud)


Mot*_*tti 10

template <int To, int From = 1>
struct printer {
    static void print() {
        cout << From << endl; 
        printer<To, From + 1>::print();
    }
};    

template <int Done>
struct printer<Done, Done> {
     static void print() {
          cout << Done << endl;
     }
};

int main() 
{
     printer<1000>::print();
}
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 10

预处理器滥用!

#include <stdio.h>

void p(int x) { printf("%d\n", x); }

#define P5(x) p(x); p(x+1); p(x+2); p(x+3); p(x+4);
#define P25(x) P5(x) P5(x+5) P5(x+10) P5(x+15) P5(x+20)
#define P125(x) P25(x) P25(x+50) P25(x+75) P25(x+100)
#define P500(x) P125(x) P125(x+125) P125(x+250) P125(x+375)

int main(void)
{
  P500(1) P500(501)
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

预处理程序(见它gcc -E input.c)很有趣.


wzd*_*zdd 9

没有人说不应该事后发生段错,对吧?

注意:这在我的64位Mac OS X系统上可以正常工作.对于其他系统,您需要相应地将args更改为setrlimit和spacechew的大小.;-)

(我不需要包括这个,但为了以防万一:这显然不是一个良好的编程实践的例子.但它确实有利用它利用这个网站的名称.)

#include <sys/resource.h>
#include <stdio.h>

void recurse(int n)
{
    printf("%d\n", n);
    recurse(n + 1);
}

int main()
{
    struct rlimit rlp;
    char spacechew[4200];

    getrlimit(RLIMIT_STACK, &rlp);
    rlp.rlim_cur = rlp.rlim_max = 40960;
    setrlimit(RLIMIT_STACK, &rlp);

    recurse(1);
    return 0; /* optimistically */
}
Run Code Online (Sandbox Code Playgroud)


小智 9

OpenMP版本(当然没有订购):

#include <iostream>
#include <omp.h>

int main(int argc, char** argv)
{
#pragma omp parallel num_threads(1000)
    {           
#pragma omp critical
        {
            std::cout << omp_get_thread_num() << std::endl;
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(不适用于VS2010 OpenMP运行时(限制为64个线程),但在Linux上可以使用,例如,英特尔编译器)

这也是订购版本:

#include <stdio.h>
#include <omp.h>

int main(int argc, char *argv[])
{
  int i = 1;
  #pragma omp parallel num_threads(1000)
  #pragma omp critical
    printf("%d ", i++);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

这仅使用O(log N)堆栈并使用McCarthy评估http://en.wikipedia.org/wiki/Short-circuit_evaluation作为其递归条件.

#include <stdio.h>

int printN(int n) {
  printf("%d\n", n);
  return 1;
}

int print_range(int low, int high) {
  return ((low+1==high) && (printN(low)) ||
      (print_range(low,(low+high)/2) && print_range((low+high)/2, high)));
}

int main() {
  print_range(1,1001);
}
Run Code Online (Sandbox Code Playgroud)

  • @Tomalak::)"哇"这里的意思是"我对这种原创方法印象非常深刻",但更为简洁 (3认同)

Mat*_*hen 8

从所谓的重复中接受的答案的 C++变体:

void print(vector<int> &v, int ind)
{
    v.at(ind);
    std::cout << ++ind << std::endl;
    try
    {
        print(v, ind);
    }
    catch(std::out_of_range &e)
    {
    }
}

int main()
{
    vector<int> v(1000);
    print(v, 0);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*aev 8

我已经重新阐述了比尔提出的使其更具普遍性的伟大例程:

void printMe () 
{
    int i = 1;
    startPrintMe:
    printf ("%d\n", i);
    void *labelPtr = &&startPrintMe + (&&exitPrintMe - &&startPrintMe) * (i++ / 1000);
    goto *labelPtr;
    exitPrintMe:
}
Run Code Online (Sandbox Code Playgroud)

更新:第二种方法需要2个功能:

void exitMe(){}
void printMe ()
{
    static int i = 1; // or 1001
    i = i * !!(1001 - i) + !(1001 - i); // makes function reusable
    printf ("%d\n", i);
    (typeof(void (*)())[]){printMe, exitMe} [!(1000-i++)](); // :)
}
Run Code Online (Sandbox Code Playgroud)

对于这两种情况,您只需拨打电话即可启动打印

printMe();
Run Code Online (Sandbox Code Playgroud)

已经过GCC 4.2测试.


rlo*_*ods 7

template <int remaining>
void print(int v) {
 printf("%d\n", v);
 print<remaining-1>(v+1);
}

template <>
void print<0>(int v) {
}

print<1000>(1);
Run Code Online (Sandbox Code Playgroud)

  • 基本上与已发布的相同. (4认同)

ram*_*ion 7

用宏!

#include<stdio.h>
#define x001(a) a
#define x002(a) x001(a);x001(a)
#define x004(a) x002(a);x002(a)
#define x008(a) x004(a);x004(a)
#define x010(a) x008(a);x008(a)
#define x020(a) x010(a);x010(a)
#define x040(a) x020(a);x020(a)
#define x080(a) x040(a);x040(a)
#define x100(a) x080(a);x080(a)
#define x200(a) x100(a);x100(a)
#define x3e8(a) x200(a);x100(a);x080(a);x040(a);x020(a);x008(a)
int main(int argc, char **argv)
{
  int i = 0;
  x3e8(printf("%d\n", ++i));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Jun*_*ter 7

#include<stdio.h>
int b=1;
int printS(){    
    printf("%d\n",b);
    b++;
    (1001-b) && printS();
}
int main(){printS();}
Run Code Online (Sandbox Code Playgroud)


小智 6

也可以使用普通的动态调度(也可以在Java中工作):

#include<iostream>
using namespace std;

class U {
  public:
  virtual U* a(U* x) = 0; 
  virtual void p(int i) = 0;
  static U* t(U* x) { return x->a(x->a(x->a(x))); }
};

class S : public U {
  public:
  U* h;
  S(U* h) : h(h) {}
  virtual U* a(U* x) { return new S(new S(new S(h->a(x)))); }
  virtual void p(int i) { cout << i << endl; h->p(i+1); }
};

class Z : public U {
  public:
  virtual U* a(U* x) { return x; }
  virtual void p(int i) {}
};

int main(int argc, char** argv) {
  U::t(U::t(U::t(new S(new Z()))))->p(1);
}
Run Code Online (Sandbox Code Playgroud)

  • 噢,你是Java开发者. (5认同)

小智 6

你可以简单地使用递归和强制错误来做到这一点......

另外,请原谅我糟糕的c ++代码.

void print_number(uint number)
{
    try
    {
        print_number(number-1);
    }
    catch(int e) {}
    printf("%d", number+1);
}

void main()
{
    print_number(1001);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

如何另一个异常终止示例.这次调整堆栈大小以在1000次递归时运行.

int main(int c, char **v)
{
    static cnt=0;
    char fill[12524];
    printf("%d\n", cnt++);
    main(c,v);
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上它打印1到1000

995
996
997
998
999
1000
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

  • 是的,着名的"我的机器上的作品"认证计划. (7认同)

小智 5

受到Orion_G的回答和reddit讨论的启发; 使用函数指针和二进制算术:

#include <stdio.h>
#define b10 1023
#define b3 7

typedef void (*fp) (int,int);

int i = 0;
void print(int a, int b) { printf("%d\n",++i); }
void kick(int a, int b) { return; }

void rec(int,int);
fp r1[] = {print, rec} ,r2[] = {kick, rec};
void rec(int a, int b) {
  (r1[(b>>1)&1])(b10,b>>1);
  (r2[(a>>1)&1])(a>>1,b);
}

int main() {
  rec(b10,b3);
  return 1;
}
Run Code Online (Sandbox Code Playgroud)


esn*_*der 5

使用宏压缩:

#include <stdio.h>

#define a printf("%d ",++i);
#define b a a a a a
#define c b b b b b
#define d c c c c c
#define e d d d d

int main ( void ) {
    int i = 0;
    e e
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

或者更好:

#include <stdio.h>

#define a printf("%d ",++i);
#define r(x) x x x x x
#define b r(r(r(a a a a)))

int main ( void ) {
    int i = 0;
    b b
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*con 5

manglesky的解决方案很棒,但没有足够的混淆.:-)所以:

#include <stdio.h>
#define TEN(S) S S S S S S S S S S
int main() { int i = 1; TEN(TEN(TEN(printf("%d\n", i++);))) return 0; }
Run Code Online (Sandbox Code Playgroud)


Sta*_*ked 5

经过一些修修补补后,我想到了这个:

template<int n>
class Printer
{
public:
    Printer()
    {        
        std::cout << (n + 1) << std::endl;
        mNextPrinter.reset(new NextPrinter);
    }

private:
    typedef Printer<n + 1> NextPrinter;
    std::auto_ptr<NextPrinter> mNextPrinter;
};

template<>
class Printer<1000>
{
};

int main()
{
    Printer<0> p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

后来@ ybungalobill的提交激发了我这个更简单的版本:

struct NumberPrinter
{
    NumberPrinter()
    {
        static int fNumber = 1;
        std::cout << fNumber++ << std::endl;
    }
};


int main()
{
    NumberPrinter n[1000];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


fou*_*nes 5

我对这一套精彩答案的贡献很小(它返回零):

#include <stdio.h>

int main(int a)
{
    return a ^ 1001 && printf("%d\n", main(a+1)) , a-1;
}
Run Code Online (Sandbox Code Playgroud)

逗号运营商是FTW\o /


Agn*_*kas 5

编辑2:

我从代码中删除了未定义的行为.感谢@sehe的通知.

没有循环,递归,条件和一切标准C ...(qsort滥用):

#include <stdio.h>
#include <stdlib.h>

int numbers[51] = {0};

int comp(const void * a, const void * b){
    numbers[0]++;
    printf("%i\n", numbers[0]);
    return 0;
}

int main()
{
  qsort(numbers+1,50,sizeof(int),comp);
  comp(NULL, NULL);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)