【发布时间】:2020-05-10 23:48:20
【问题描述】:
我尝试使用循环展开以不同方式循环数组。
#define MYSIZE 8
int main()
{
int A[MYSIZE];
int B[MYSIZE];
int C[MYSIZE];
int i = 0;
while(i < MYSIZE)
{
A[i] = i;
i++;
}
/* LOOP 1 */
i = 0;
while (i< MYSIZE)
{
B[i+0] = A[i+0];
B[i+1] = A[i+1];
B[i+2] = A[i+2];
B[i+3] = A[i+3];
i += 4;
}
/* LOOP 2 */
i = 0;
while (i < MYSIZE)
{
C[i] = A[i++];
C[i] = A[i++];
C[i] = A[i++];
C[i] = A[i++];
}
printf(" i | A | B | C|\r\n");
i = 0;
while (i < MYSIZE)
{
printf(" %d | %d | %d | %d |\r\n",i,A[i],B[i],C[i]);
i++;
}
}
这确实给了我这个结果:
i | A | B | C |
0 | 0 | 0 | 1578166688 |
1 | 1 | 1 | 0 |
2 | 2 | 2 | 1 |
3 | 3 | 3 | 2 |
4 | 4 | 4 | 3 |
5 | 5 | 5 | 4 |
6 | 6 | 6 | 5 |
7 | 7 | 7 | 6 |
我认为 A、B 和 C 应该包含相同的数字。 据我了解 i++,LOOP 2 应该与以下内容相同:
/* LOOP 3 */
i = 0
while(i < MYSIZE)
{
C[i] = A[i];
i++;
C[i] = A[i];
i++;
C[i] = A[i];
i++;
C[i] = A[i];
i++;
}
事实并非如此。 LOOP 3 实际上可以正常工作,但 LOOP 2 不能。我做错了什么?
【问题讨论】:
-
循环 2 (
C[i] = A[i++];) 导致未定义的行为。循环 1 或循环 3 是执行您尝试的正确方法。 -
但是为什么呢? LHS 和 RHS 评估的顺序不是确定性的吗?
-
如果
i和i++之间没有序列点,则它们的行为是“不确定的”。并且作业没有。 -
是的,谢谢大家回答我的问题 :)
-
@Ambadrant 如果答案解决了您的问题,请考虑accepting it。
标签: c loops post-increment