【问题标题】:Print 1 to 1000 with out using loop [duplicate]使用循环打印 1 到 1000 [重复]
【发布时间】:2014-11-04 09:29:02
【问题描述】:

我在 c++ 编程上下文中看到了这个问题,我检查了一个解决方案,我的一个朋友给了我这段代码,它的工作很完美,但我无法理解它的逻辑以及它是如何工作的。我问过他,但他也不知道程序实际上是如何工作的,我认为他也从某个地方采取了这个解决方案。任何人都可以解释这背后的逻辑,我的意思是在线 (&main +(&exit - &main)*(j/1000))(j+1);

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

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

提前致谢

【问题讨论】:

  • 不能在 C++ 中递归调用main
  • 感谢您的快速重播。我在 c++ 中尝试过,但它不起作用,但在 c 中它可以完美地工作。但我不知道它是如何工作的。我的意思是它的逻辑
  • 这是标准main 签名吗?
  • 似乎这段代码是在“作弊”,它使用递归函数调用来创建计数循环(它不是显式循环,但那里仍然存在循环)。不过,不错的解决方案。
  • 指针减法是未定义的行为。

标签: c


【解决方案1】:

它的工作原理如下:

执行int 除法j/1000,这将始终返回0,而j 小于1000。 所以指针操作如下:

&main + 0 = &main, for j < 1000.

然后它调用作为参数j+1 传递的指针操作指向的结果函数。 当j小于1000时,它会递归调用main,参数比上一步多了一个。

j的值达到1000,那么整数除法j/1000等于1,指针运算结果如下:

&main + &exit - &main = &exit.

然后调用exit函数,完成程序执行。

【讨论】:

  • 感谢您的重播
  • exit函数一定要显式写吗?还是可以从主推导出来的?
  • 退出函数来自C标准库,定义在stdlib.h中。
  • 它基本上“线性插值”从MAIN 函数到EXIT 函数的差异,integer-division 因此从A to B 的切换是即时一旦达到1001 - 并且每次从MAIN递归调用 中增加整数。
【解决方案2】:

我已经给出了解释,但如果写成如下内容会更容易理解:

void main(int j) {
   if(j == 1001)
      return;
   else
   {   
      printf("%d\n", j); 
      main(j+1);
   }   
}

上面的代码和已经写好的代码是一样的。

【讨论】:

  • 真的这个比上面的更简单,但是逻辑不一样
  • 这个想法是一样的。您刚刚被混淆的那个,这是进行递归的规范方法:- 尽管您通常不会使用 main 来执行此操作,因为它在技术上不是有效的 main 签名 iirc
  • 真的是比上面一个更简单的方法。感谢您的重播
  • @ArunPrasanth np。这背后的想法是递归,这将使您更容易理解代码而不是您发布的代码
猜你喜欢
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2018-02-04
  • 2016-10-08
  • 2017-12-16
相关资源
最近更新 更多