如何在此C程序中评估以下赋值?

问题描述 投票:0回答:1
#include <stdio.h>

int main()
{
    int i = 2;
    int arr[5] = {0};

    arr[++i] = i++;

    for(int i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

这将arr[4]分配为3,但下标如何从2变为4?有人可以逐步评估来解释吗?

c arrays operators operator-precedence array-indexing
1个回答
-1
投票
所以,让我们逐行看一下main()的正文:

int i = 2;

这相对简单。在堆栈上为main创建一个变量,并将值2写入其中。

int arr[5] = {0};

类似于以前,但是现在我们创建一个大小为5个整数的块,并为它们分配0。

arr[++i] = i++;

这是问题的根源。在这里,操作员的关联性和优先级开始起作用。查阅here以获得很好地列出规则的表格。

但是,在我们的特定情况下,我们有一个赋值运算符,其赋值为

从右到左

。因此,首先评估i++。由于i开头为2,因此给出的答案为3。因此,赋值的右侧现在的值为3。

现在我们可以看一下左侧。现在评估arr[++i]。首先评估++i,由于i现在为3,所以++i变为4。然后对该数组进行下标并将(3)之前的右侧值分配给arr[4]

我想程序的其余部分不会给您带来问题,所以我不会再讨论它。
© www.soinside.com 2019 - 2024. All rights reserved.