C中的结构和数组递增
structs and array incrementation in C
目前我正在尝试将一些代码从 C 翻译成 C#,但我 运行 遇到了一些问题。
因为我是一名 C# 程序员并且不知道 C 我必须在这里问一些问题(没有找到可以回答我的问题)。我在 C 中有以下代码:
struct item { short sectorno,sx1,sx2; } queue[MaxQueue], *head=queue, *tail=queue;
short ytop[W]={0}, ybottom[W], renderedsectors[NumSectors];
*head = (struct item) { player.sector, 0, W-1 };
if(++head == queue+MaxQueue) head = queue;
const struct item now = *tail;
if(++tail == queue+MaxQueue) tail = queue;
if(renderedsectors[now.sectorno] & 0x21) continue;
++renderedsectors[now.sectorno];
我用 C# 写的:
Item[] queue = new Item[MaxQueue];
Item[] head = queue;
Item[] tail = queue;
int[] ytop = new int[W]; //{ 0 };
int[] ybottom = new int[W];
int[] renderedsectors = new int[NumSectors];
for (int x = 0; x < W; ++x)
{
ybottom[x] = H - 1;
}
for (int n = 0; n < NumSectors; ++n)
{
renderedsectors[n] = 0;
}
head[0] = new Item { sectorno = player.sector, sx1 = 0, sx2 = W - 1 };
if (head[1] == queue[queue.Length - 1])
{
head = queue;
}
我希望到目前为止这是正确的。现在我的问题:
什么
short ytop[W]={0}
做什么?
这是一组短裤,对吧?这里数组的第一个位置是0赋值了吗?这就是我从调试器中得出的结论。
我无法理解以下行:
if(++head == queue+MaxQueue) head = queue;
数组上的 ++ 是否递增数组的索引? queue+32 是否表示数组的最后一个位置? (奇怪,因为那将是位置 32,这将超出范围...)
最后一件事..那是什么意思?
++renderedsectors[now.sectorno];
我会说递增数组的索引,但是它存储在哪里以及如何存储?
非常感谢!我很高兴能帮助理解这段 C 代码。
short ytop[W]={0}
将 ytop
声明为 W
类型 short
元素的数组,并将其中第一个明确初始化为零。其余元素默认初始化,这也将元素初始化为零。 (这是 C 中的一个习语,因为在函数中定义一个带有 short ytop[W];
的数组根本不会初始化它;元素值将是不确定的。显式初始化其中一个会触发其余部分的默认初始化。)
在 if(++head == queue+MaxQueue) head = queue;
中,++head
做了两件事:
- 增加
head
的存储值。
- 为了计算表达式的其余部分,
++head
的值是包含增量的 head
的值。
关于此的两个注意事项:
if(++head == queue+MaxQueue) head = queue;
与先递增 head = head + 1;
然后 if(head == queue+MaxQueue) head = queue;
大致相同。但是,C 语义中的技术细节有所不同; head
值的实际内存更新不一定与表达式的计算同步。
- 当一个指针被添加时,结果是指向内存中下一个数组元素的指针,而不是内存中的下一个字节。指针的类型用于知道它指向什么样的元素以及该元素有多大。
queue+MaxQueue
生成一个指针,指向 MaxQueue
个超出 queue
指向的元素。如果 queue
是数组或指向数组开头的指针,并且 MaxQueue
是数组中元素的数量,则 this 指向数组最后一个元素之后的位置。没关系;这样我们就可以指向数组的“末尾”,作为结束位置的标记。
在++renderedsectors[now.sectorno];
中,renderedsectors[now.sectorno]
是renderedsectors
中索引为now.sectorno
的元素。 ++
递增其存储值。
目前我正在尝试将一些代码从 C 翻译成 C#,但我 运行 遇到了一些问题。 因为我是一名 C# 程序员并且不知道 C 我必须在这里问一些问题(没有找到可以回答我的问题)。我在 C 中有以下代码:
struct item { short sectorno,sx1,sx2; } queue[MaxQueue], *head=queue, *tail=queue;
short ytop[W]={0}, ybottom[W], renderedsectors[NumSectors];
*head = (struct item) { player.sector, 0, W-1 };
if(++head == queue+MaxQueue) head = queue;
const struct item now = *tail;
if(++tail == queue+MaxQueue) tail = queue;
if(renderedsectors[now.sectorno] & 0x21) continue;
++renderedsectors[now.sectorno];
我用 C# 写的:
Item[] queue = new Item[MaxQueue];
Item[] head = queue;
Item[] tail = queue;
int[] ytop = new int[W]; //{ 0 };
int[] ybottom = new int[W];
int[] renderedsectors = new int[NumSectors];
for (int x = 0; x < W; ++x)
{
ybottom[x] = H - 1;
}
for (int n = 0; n < NumSectors; ++n)
{
renderedsectors[n] = 0;
}
head[0] = new Item { sectorno = player.sector, sx1 = 0, sx2 = W - 1 };
if (head[1] == queue[queue.Length - 1])
{
head = queue;
}
我希望到目前为止这是正确的。现在我的问题:
什么
short ytop[W]={0}
做什么? 这是一组短裤,对吧?这里数组的第一个位置是0赋值了吗?这就是我从调试器中得出的结论。
我无法理解以下行:
if(++head == queue+MaxQueue) head = queue;
数组上的 ++ 是否递增数组的索引? queue+32 是否表示数组的最后一个位置? (奇怪,因为那将是位置 32,这将超出范围...)
最后一件事..那是什么意思?
++renderedsectors[now.sectorno];
我会说递增数组的索引,但是它存储在哪里以及如何存储?
非常感谢!我很高兴能帮助理解这段 C 代码。
short ytop[W]={0}
将 ytop
声明为 W
类型 short
元素的数组,并将其中第一个明确初始化为零。其余元素默认初始化,这也将元素初始化为零。 (这是 C 中的一个习语,因为在函数中定义一个带有 short ytop[W];
的数组根本不会初始化它;元素值将是不确定的。显式初始化其中一个会触发其余部分的默认初始化。)
在 if(++head == queue+MaxQueue) head = queue;
中,++head
做了两件事:
- 增加
head
的存储值。 - 为了计算表达式的其余部分,
++head
的值是包含增量的head
的值。
关于此的两个注意事项:
if(++head == queue+MaxQueue) head = queue;
与先递增head = head + 1;
然后if(head == queue+MaxQueue) head = queue;
大致相同。但是,C 语义中的技术细节有所不同;head
值的实际内存更新不一定与表达式的计算同步。- 当一个指针被添加时,结果是指向内存中下一个数组元素的指针,而不是内存中的下一个字节。指针的类型用于知道它指向什么样的元素以及该元素有多大。
queue+MaxQueue
生成一个指针,指向 MaxQueue
个超出 queue
指向的元素。如果 queue
是数组或指向数组开头的指针,并且 MaxQueue
是数组中元素的数量,则 this 指向数组最后一个元素之后的位置。没关系;这样我们就可以指向数组的“末尾”,作为结束位置的标记。
在++renderedsectors[now.sectorno];
中,renderedsectors[now.sectorno]
是renderedsectors
中索引为now.sectorno
的元素。 ++
递增其存储值。