你好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 ---------- ```
1条答案
按热度按时间mrphzbgm1#
请记住,
i--
返回i
的 old 值,然后再递减它。如果我们展开内部循环,那么它将像这样开始:
注意
i
仍然是递减的!所以当内部循环结束时,i
的值将等于-1
。然后外部循环的迭代发生,
i == -1
。由于i
是非零的,你将得到一个无限循环while (i--)
,其中i
不断递减,直到达到int
可以处理的极限。然后你将得到一个算术下溢,这反过来又导致 * 未定义的行为 *。