You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段含后置++的C# while循环代码会无限输出0?

问题原因

你踩中了后置自增运算符与赋值操作组合的执行顺序陷阱,代码无限输出0死循环的核心逻辑可以拆解为以下步骤:

首先是问题复现代码:

int test = 0;
while (test < 100)
{
    test = test % 2 == 0 ? test++ : test + 2;
    Console.WriteLine(test);
}

执行时序拆解

C#的表达式求值遵循严格的从左到右顺序,运算符副作用的生效时机有明确规范,第一次循环的完整执行流程是:

  1. 初始test值为0,判断test < 100成立,进入循环体
  2. 计算三元表达式的判断条件:test % 2 == 0,0对2取余为0,条件为真,执行test++分支
  3. 执行后置自增test++:
    • 第一步:先把test当前的原始值0保存为临时返回值
    • 第二步:将test本身的值修改为1,这是自增的副作用
  4. 执行最外层的赋值操作:把三元表达式返回的临时值0,重新赋值给test

这一步就是和你预期不符的核心:你以为自增发生在赋值之后,实际自增的副作用在赋值前就已经执行了,只是自增返回的是修改前的旧值,赋值操作直接把刚自增成1的test又覆盖回了0。

后续每一轮循环test都是0,会完全重复上述流程,永远达不到循环终止条件,就会持续输出0。

正确写法

不要在同一个赋值表达式里对同一个变量同时使用自增运算符,两种改法都可以:

  • 直接用算术计算替代自增,避免时序混淆:
test = test % 2 == 0 ? test + 1 : test + 2;
  • 把自增逻辑和赋值拆分,逻辑更清晰:
if (test % 2 == 0)
{
    test++;
}
else
{
    test += 2;
}

注意:不止C#,Java等沿用C风格自增语法的语言都存在类似的时序陷阱,日常编码尽量避免在同一个表达式内对同一变量多次修改、或者同时做修改和赋值,否则很容易出现不符合预期的结果。

内容的提问来源于stack exchange,提问作者nicscan3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:03:18