当达到零时J增量行为的澄清(c编程语言)

des4xlb0  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(109)

你好Stack Overflow社区
我正在寻找一个解释,我在我的代码中观察到的一个特定的行为。我注意到,变量j一旦达到值0就开始递增。谁能帮助我理解这种行为背后的原因?任何见解或解释都将非常感谢。谢谢!
下面是代码:

int main(void)
{
    int j = 2;
    int i = 2;
    while(1)
    {
        printf("initial i : %d ---------- \n", i);
        printf("initial j : %d ---------- \n", j);
        while(i--) {
           j--; 
        }
        printf("the second i : %d ---------- \n", i);
        printf("the second j : %d ---------- \n", j);
        printf("----------------------------------\n");
           
    }
}

首先,它开始递减i和j,直到i达到0,这是正确的,因为while (i--)在尝试0值时被认为是假的,但问题是它仍然输入值为-1的while,并从最后一个值0开始递增j的值,然后是1,2,...。
下面是输出:

initial i : 2 ---------- 
initial j : 2 ---------- 
the second i : -1 ---------- 
the second j : 0 ---------- 
----------------------------------
initial i : -1 ---------- 
initial j : 0 ---------- 



the second i : -1 ---------- 
the second j : 1 ---------- 
----------------------------------
initial i : -1 ---------- 
initial j : 1 ---------- 






the second i : -1 ---------- 
the second j : 2 ---------- 
----------------------------------
initial i : -1 ---------- 
initial j : 2 ---------- 





the second i : -1 ---------- 
the second j : 3 ---------- 
----------------------------------
initial i : -1 ---------- 
initial j : 3 ---------- ```
mrphzbgm

mrphzbgm1#

请记住,i--返回iold 值,然后再递减它。
如果我们展开内部循环,那么它将像这样开始:

// i == 2
j--;
i--;

// i == 1
j--;
i--;

// i == 0
// No loop
i--;

注意i仍然是递减的!所以当内部循环结束时,i的值将等于-1
然后外部循环的迭代发生,i == -1。由于i是非零的,你将得到一个无限循环while (i--),其中i不断递减,直到达到int可以处理的极限。然后你将得到一个算术下溢,这反过来又导致 * 未定义的行为 *。

相关问题