当我运行以下代码时,我得到了输出:0 0 2 0 0
int main(){
static int var[5];
int count=0;
var[++count]=++count;
for(count=0;count<5;count++)
{
printf("%d ",var[count]);
}
return 0;
}
语句var[++count]=++count;
根据C17标准6.5.2诱导未定义行为:
如果标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算是无序的,则行为未定义。如果一个表达式的子表达式有多个允许的顺序,那么如果在任意一个顺序中出现这种未排序的副作用,则该行为是未定义的。
因此,对于每个唯一变量,如果它是预加的,那么它的值不能在表达式的其他地方使用。结果将是变量首先递增,然后在表达式中使用其递增的值。
代码是技术上未定义的行为。实际(可能)发生的情况是,count
被加了两次,然后既用作索引又用作值。