【发布时间】:2015-11-16 02:38:20
【问题描述】:
此 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 草案。它说(在 6.5 表达式中):
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。此外,应仅读取先验值以确定要存储的值。
它没有提到读取对象以确定要修改的对象本身。因此,此语句可能会产生未定义的行为。
但是,我觉得这很奇怪。这实际上会产生未定义的行为吗?
(我也想知道其他ISO C版本的这个问题。)
【问题讨论】:
-
没有。它本身不是一种表达方式。而且它只修改一次,读了两次。
-
什么不是表达式?为什么
a[a[0]] = 1;两次读取a[0]?好像读过一次a[0]。 -
int index = a[0]; a[index] = 1;怎么样?然后,您还可以通过将第二条语句替换为if(index<(sizeof(a)/sizeof(int))) a[index] = 1;来确保索引在数组的范围内 -
为什么不试试运行呢?
-
@DeveshKhandelwal;不。在这种情况下,仅运行并查看输出无济于事。
标签: c language-lawyer c99 undefined-behavior