这是因为`char(num % 10 + '0')`和`char(num % 10)`在语义和结果上完全不同,具体原因如下:
### 1. **`num % 10`的含义**
`num % 10`计算的是`num`除以10的余数,结果是一个**整数**,范围是`0`到`9`。例如:
- 如果`num = 123`,那么`num % 10`的结果是`3`。
- 如果`num = 456`,那么`num % 10`的结果是`6`。
### 2. **`char(num % 10)`的问题**
`char(num % 10)`会将`num % 10`的结果(一个整数)直接转换为`char`类型。在C++中,`char`类型可以表示一个字符,但也可以表示一个**小整数**(通常是8位整数)。因此,`char(num % 10)`的结果是一个**字符类型的整数**,而不是我们期望的字符。
例如:
- 如果`num % 10`的结果是`3`,那么`char(3)`表示的是ASCII码为3的字符,而不是字符`'3'`。
- ASCII码表中,`3`对应的字符是一个控制字符(End of Text),而不是我们期望的数字字符`'3'`。
### 3. **`char(num % 10 + '0')`的正确性**
`'0'`在C++中是一个字符常量,其ASCII码值是`48`。当我们写`num % 10 + '0'`时,实际上是将`num % 10`的结果(一个整数)加上`48`,得到一个新的整数,然后将这个整数转换为`char`类型。
例如:
- 如果`num % 10`的结果是`3`,那么`3 + '0'`的结果是`3 + 48 = 51`。
- ASCII码表中,`51`对应的字符是`'3'`,这正是我们期望的数字字符。
因此,`char(num % 10 + '0')`会将`num % 10`的结果正确地转换为对应的数字字符。
### 4. **ASCII码表的作用**
ASCII码表定义了字符和整数之间的映射关系。在ASCII码表中:
- `'0'`的ASCII码值是`48`
- `'1'`的ASCII码值是`49`
- ...
- `'9'`的ASCII码值是`57`
通过加上`'0'`,我们可以将整数`0`到`9`映射到对应的字符`'0'`到`'9'`。
### 总结
- **`char(num % 10)`**:将`num % 10`的结果直接转换为`char`类型,得到的是一个字符类型的整数,而不是数字字符。
- **`char(num % 10 + '0')`**:将`num % 10`的结果加上`'0'`的ASCII码值,然后转换为`char`类型,得到的是对应的数字字符。
这就是为什么`char(num % 10 + '0')`是正确的,而`char(num % 10)`是错误的原因。