这段C99代码是否会产生未定义的行为?
#include <stdio.h>
int main() {
int a[3] = {0, 0, 0};
a[a[0]] = 1;
printf("a[0] = %d\n", a[0]);
return 0;
}
在语句a[a[0]] = 1;
中,a[0]
既被读取又被修改。根据ISO/IEC 9899的n1124草案,在前一个和下一个序列点之间,一个对象在表达式的求值过程中最多只能被修改一次。此外,先前的值只能被读取以确定要存储的值。它没有提到读取一个对象以确定要修改的对象本身。因此,这个语句可能产生未定义的行为。然而,我感觉很奇怪。这实际上会产生未定义的行为吗?(我还想了解其他ISO C版本中的这个问题。)
a[a[0]] = 1;
会读取两次a[0]
?它似乎只读取一次a[0]
。 - Masaki Haraint index = a[0]; a[index] = 1;
怎么样?然后,你还可以通过将第二个语句替换为if(index<(sizeof(a)/sizeof(int))) a[index] = 1;
来确保索引在数组的范围内。 - Daniel M.