Online Compiler C

#include <stdio.h> int main() { int unsigned num; int max = 0; int min = 9; if(num=0)printf("0"); scanf("%u", &num); while (num > 0) { int d = num % 10; num = num / 10; if (d >= max) { max = d; } if (d <= min) { min = d; } } printf("%d %d", min, max); return 0; }
这段代码的目的是读取一个无符号整数,找出它的各位数字中的最小值和最大值,并输出。但代码中存在几个问题。

- 第6行 `if(num=0)printf("0");` 这里使用了赋值运算符 `=` 而不是比较运算符 `==`,这会把 `num` 设为0,并且条件永远为真(因为赋值表达式的值是0,但0在C中视为假,所以实际上不会执行printf)。更关键的是,这行代码在 `scanf` 之前执行,此时 `num` 未初始化,行为未定义。这行代码应该被移除或修正。

- 变量 `min` 初始化为9,这通常没问题,但如果输入的数字中所有位都大于9(不可能)或输入为0,则逻辑需要调整。不过主要问题在于输入为0时,`while` 循环不会执行,而 `min` 和 `max` 会保持初始值9和0,输出会是 `9 0`,但实际期望应该是 `0 0`。你需要考虑当输入为0时如何处理。

- 另外,`int unsigned num;` 的写法虽然合法,但更常见的写法是 `unsigned int num;`。