mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
c
This commit is contained in:
parent
236cb5557e
commit
e11707a667
@ -1593,6 +1593,54 @@ int main(){
|
||||
}
|
||||
```
|
||||
|
||||
### 1.7.4 数据类型转换只是临时性的
|
||||
|
||||
* 无论是自动类型转换还是强制类型转换,都是为了本次运算而进行的临时性转换,其转换的结果只会保存在临时的内存空间,并不会改变数据原先的类型或值,如下所示:
|
||||
|
||||
```c {8}
|
||||
#include <stdio.h>
|
||||
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 是怎么找到对应的数据的?
|
||||
|
Loading…
Reference in New Issue
Block a user