C 在数组中分配错误的索引
C assignes wrong index in array
我有密码
#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++;
需要使用循环来更新'y'值
// for loop execution
for( int i = 0; i <= 2; i++ )
{
y[i] = i;
}
printf("y0: %d\n", y[0] );
printf("y1: %d\n", y[1] );
printf("y2: %d\n", y[2] );
我有密码
#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++;
需要使用循环来更新'y'值
// for loop execution
for( int i = 0; i <= 2; i++ )
{
y[i] = i;
}
printf("y0: %d\n", y[0] );
printf("y1: %d\n", y[1] );
printf("y2: %d\n", y[2] );