【问题标题】:Why use "(array) + count" in foreach macro?为什么在 foreach 宏中使用“(array) + count”?
【发布时间】:2016-01-27 18:24:50
【问题描述】:

我从 here 获得 foreach 宏

#define foreach(item, array) \
    for(int keep = 1, \
            count = 0,\
            size = sizeof (array) / sizeof *(array); \
        keep && count != size; \
        keep = !keep, count++) \
      for(item = (array) + count; keep; keep = !keep)

我不明白“(array) + count”,它等于“&array[count]”,但为什么不用“array[count]”而不是“(array) + count”

【问题讨论】:

  • 您的意思是“为什么不使用array[count]”(如书面)或“为什么不使用@array[count]”(根据您对(array) + count 等于什么的评论)?
  • 建议edit/compile/runit两种方式,看看有没有区别

标签: c macros


【解决方案1】:

但为什么不使用“array[count]”而不是“(array) + count”

来自the linked post

foreach(int *v, values) {
    printf("value: %d\n", *v);
}

在宏中,item 的类型为 int*,并且 array[count] 的类型为 int

因此你不能使用:

item = array[count];

但你可以使用

item = (array) + count;

因为(array) + count 的计算结果为int*

【讨论】:

  • 你是对的,使用点更节省内存,但如果我将“int *v”更改为“int v”并将“(array) + count”更改为“array[count”,它是更方便。
  • @nwaicaethi,你可以这样做。
【解决方案2】:

array+count&array[count]count+array 没有区别。

只是这些都是地址,因此您不能像以前那样将它们分配给整数值:

int item=array+count;

但是对于一个整数指针:

int* item=array+count; or int* item= &array[count];

【讨论】:

  • @chux 我的错误,谢谢
【解决方案3】:

它们是等价的,你使用哪一个完全取决于程序员的语义风格。

当您将数组传递给函数时,数组会衰减为指针,确切地说是指向第一个数组元素的指针。因此,您可以同时使用两者。

【讨论】:

  • NMDV 帖子中没有函数调用,所以为什么“当您将数组传递给函数时,数组会衰减为指针”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 2011-08-06
相关资源
最近更新 更多