我有一个代码
#include <stdio.h>
int main(){
int y [10]; int i = 1;
y[i] = i++;
printf("y0: %d\n", y[0] );
printf("y1: %d\n", y[1] );
printf("y2: %d\n", y[2] );
}
我认为那条线
y[i] = i++;
应该作为 y[1] = 1;然后将 i 设置为 2;
但是 y[1] 有一些随机值,并且 y[2] 设置为 1。为什么?
最佳答案
您处于未定义行为的范围内。在某些编译器上它可能有效,而在其他编译器上则可能无效。
问题在于该行
y[i] = i++;
i 被评估两次,您无法假设它是赋值之前还是之后的表达式。
如果首先计算 i++,则表达式结果将变为 1。但在计算 y[i] 之前,它会递增。所以 i == 2 然后创建 y[2] = 1 的结果; 如果首先评估赋值之前的 i,则结果变为 y[1] = 1;我++;
将其更改为当然可以修复它:
y[i] = i;
i++;
关于C 在数组中分配错误的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33998791/