Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Python风格迭代器_Python_C_Iterator_Jit_Algol68 - Fatal编程技术网

C语言中的Python风格迭代器

C语言中的Python风格迭代器,python,c,iterator,jit,algol68,Python,C,Iterator,Jit,Algol68,python中的“yield”语句允许从过程进行简单的迭代,也意味着序列不需要预先计算并存储在“任意”大小的数组中 有没有类似的方法从C过程中进行迭代(使用yield)?我不时地把这个URL作为一个笑话拉出来: 我认为对你的问题的正确答案是:没有直接的等价物,试图伪造它可能不会那么干净或易于使用。没有 又好又短 下面是一个社区维基版的自我回答,可以选择它作为“答案”。请直接向上/向下投票至实际的自我回答 以下是我找到的方法: /* Example calculates the sum o

python中的“yield”语句允许从过程进行简单的迭代,也意味着序列不需要预先计算并存储在“任意”大小的数组中


有没有类似的方法从C过程中进行迭代(使用yield)?

我不时地把这个URL作为一个笑话拉出来:

我认为对你的问题的正确答案是:没有直接的等价物,试图伪造它可能不会那么干净或易于使用。

没有

又好又短

下面是一个社区维基版的自我回答,可以选择它作为“答案”。请直接向上/向下投票至实际的自我回答

以下是我找到的方法:

    /* Example calculates the sum of the prime factors of the first 32 Fibonacci numbers */
#include <stdio.h>

typedef enum{false=0, true=1}bool;

/* the following line is the only time I have ever required "auto" */
#define FOR(i,iterator) auto bool lambda(i); yield_init = (void *)&lambda; iterator; bool lambda(i)
#define DO {
#define     YIELD(x) if(!yield(x))return
#define     BREAK return false
#define     CONTINUE return true
#define OD CONTINUE; }
/* Warning: _Most_ FOR(,){ } loops _must_ have a CONTINUE as the last statement. 
 *  *   Otherwise the lambda will return random value from stack, and may terminate early */

typedef void iterator; /* hint at procedure purpose */
static volatile void *yield_init;
#define YIELDS(type) bool (*yield)(type) = yield_init

iterator fibonacci(int n){
   YIELDS(int);
   int i;
   int pair[2] = {0,1};
   YIELD(0); YIELD(1);
   for(i=2; i<n; i++){
      pair[i%2] = pair[0] + pair[1];
      YIELD(pair[i%2]);
   }
}

iterator factors(int n){
  YIELDS(int); 
  int i;
  for(i=2; i*i<=n; i++){
    while(n%i == 0 ){
      YIELD(i);
      n/=i;
    }
  }
  YIELD(n);
}

main(){
    FOR(int i, fibonacci(32)){
        printf("%d:", i);
        int sum = 0;
        FOR(int factor, factors(i)){
            sum += factor;
            printf(" %d",factor);
            CONTINUE;
        }
        printf(" - sum of factors: %d\n", sum);
        CONTINUE;
    }
}
/*示例计算前32个斐波那契数的素因子之和*/
#包括
typedef枚举{false=0,true=1}bool;
/*下面这行是我唯一一次需要“自动”*/
#定义(i,迭代器)自动布尔lambda(i);收益率_init=(void*)&lambda;迭代器;布尔·兰姆达(一)
#定义DO{
#如果(!收益率(x))返回,则定义收益率(x)
#定义中断返回false
#定义继续返回true
#定义OD CONTINUE;}
/*警告:_Most_uuufor(,){}循环u必须将CONTINUE作为最后一条语句。
**否则lambda将从堆栈返回随机值,并可能提前终止*/
typedef无效迭代器;/*暗示程序目的*/
静态挥发性空隙率*yield_init;
#定义收益率(类型)布尔(*收益率)(类型)=收益率
迭代器斐波那契(int n){
收益率(整数);
int i;
int对[2]={0,1};
收益率(0);收益率(1);

对于(i=2;我问这个问题有什么意义?你只是想自己回答这个问题来提高你的评分?它昨天在Reddit上,所以我不认为这是巧合。所以你的问题得到-1,我的答案得到-1。你应该只在这么短的时间问问题。我感谢你打算分享知识,但像Reddit这样的地方和Digg更适合这样做。我将撤销我的反对票,因为你的错误是无意的。@qrdl这是很久以前处理的()NevilleDNZ的行为不仅是可以接受的,而且是值得鼓励的。你甚至可以得到一个徽章,因为你自己的问题的答案获得了3张赞成票。这是一个问答的地方,一个人同时提供这两个答案的事实不值得小看。每当我发现这种情况,我都会将自我答案复制粘贴到社区维基上自有答案,可选择为“该”答案(因为问题已被回答)。这看起来非常棒,但是有没有解释它是如何工作的。我对整个auto bool lambda语句感到非常困惑。好的,没关系。我想我理解了。基本上,它将实际循环声明为函数进行迭代,然后在迭代器函数中调用该函数。