在线编译器 C

#include <stdio.h> int main() { int n, i = 1, m = 0; scanf("%d", &n); while (i <= 3) { n = n / 10; m++; i++; } if (n = 0) printf("YES"); else printf("NO"); return 0; }
这段代码试图判断一个整数是否恰好有3位数字。它通过循环将数字除以10三次,然后检查结果是否为0。但代码中存在逻辑错误。

- 在循环中,每次除以10会去掉最后一位数字。如果数字恰好是3位,除以10三次后应该变成0。但循环条件 `i <= 3` 固定执行3次,没有考虑数字位数不足3位的情况(例如两位数也会执行3次除法,结果变成0,导致误判)。
- 第9行的 `if (n = 0)` 是赋值操作,不是比较。`=` 是赋值运算符,`==` 才是相等比较。这会导致条件永远为假(因为赋值后n为0,但表达式值为0,即假),所以无论输入什么都会输出"NO"。

- 检查循环逻辑:如果输入的数字位数少于3位,比如输入12,循环三次后n也会变成0,导致错误输出"YES"。需要思考如何只对恰好3位的数字进行正确判断。
- 将第9行的 `=` 改为 `==` 才能正确比较。