diff --git a/docs/notes/01_c-basic/03_xdx/index.md b/docs/notes/01_c-basic/03_xdx/index.md index eb3c81c..3e314e4 100644 --- a/docs/notes/01_c-basic/03_xdx/index.md +++ b/docs/notes/01_c-basic/03_xdx/index.md @@ -1593,6 +1593,54 @@ int main(){ } ``` +### 1.7.4 数据类型转换只是临时性的 + +* 无论是自动类型转换还是强制类型转换,都是为了本次运算而进行的临时性转换,其转换的结果只会保存在临时的内存空间,并不会改变数据原先的类型或值,如下所示: + +```c {8} +#include +int main() { + + double total = 100.12; // 总价 + int count = 2; // 总数 + double price = 0.0; // 单价 + + int totalInt = (int)total; // 强制类型转换 + + price = total / count; // 计算单价 + + printf("total = %.2lf\n", total); // total = 100.12 + printf("totalInt = %d\n", totalInt); // totalInt = 100 + printf("price = %.2lf\n", price); // price = 50.06 + + return 0; +} +``` + +* 虽然 `total` 变量,通过强制类型转换变为了 `int` 类型,才可以赋值给 `totalInt`变量;但是,这种转换并没有影响 `total` 变量本身的`类型`和`值`。 + +> [!NOTE] +> +> * ① 如果 `total` 变量的`值`或`类型`变化了,那么 `total` 的显示结果,就应该是 `100.00` ,而不是 `100.12` 。 +> * ② 那么,`price` 的结果,显而易见就应该是 `50.00` ,而不是 `50.06` 了。 + +### 1.7.5 自动类型转换 VS 强制类型转换 + +* 在 C 语言中,有些数据类型即可以自动类型转换,也可以强制类型转换,如:`int --> double`、`double --> int` 等。但是,有些数据类型只能强制类型转换,不能自动类型转换,如:`void* --> int*` 。 +* 可以自动类型转换的类型一定可以强制类型转换;但是,可以强制类型转换的类型却不一定能够自动类型转换。 + +> [!NOTE] +> +> * ① 目前学习到的数据类型,既可以自动类型转换,也可以强制类型转换。 +> * ② 后面,如果学到指针,就会发生指针有的时候,只能强制类型转换却不能自动类型转换;需要说明的是,并非所有的指针都可以强制类型转换,是有条件的,后文讲解。 + +* 可以自动类型转换的类型,在发生类型转换的时候,一般风险较低,不会给程序带来严重的后果,如:`int --> double` 就没什么毛病,而 `double --> int` 无非丢失精度而已。但是 ,只能强制类型转换的类型,在发生类型转换的时候,通常风险较高,如:`char* --> int*` 就非常奇怪,会导致取得的值也很奇怪,进而导致程序崩溃。 + +> [!IMPORTANT] +> +> * ① 在实际开发中,如果使用 C 语言进行开发,在进行强制类型转换的时候,需要小心谨慎,防止出现一些奇怪的问题,进而导致程序崩溃!!! +> * ② 现代化的高级编程语言,如:Java 等,直接屏蔽了指针。所以,在使用这些编程语言的时候,无需担心进行强制类型转换时,会出现一些奇怪的问题,进而导致程序崩溃!!! + ## 1.8 再谈数据类型 * 通过之前的知识,我们知道,CPU 是直接和内存打交道的,CPU 在处理数据的时候,会将数据临时存放到内存中。内存那么大,CPU 是怎么找到对应的数据的?