再学C语言17:类型转换

语句和表达式通常只应该使用一种类型的常量和变量

如果使用混合类型,C将会使用一个规则集合自动完成类型转换

一、基本的规则

1)当出现在表达式中时,有符号和无符号的char类型和short类型都将自动被转换为int(在需要的情况下将自动被转换为unsigned int);在K&R C下,float将被自动转换为double;因为这种自动转换都是将原来的类型转换为较大的类型,所以被称为提升

2)在包含两种数据类型的任何运算中,两个值都被转换为两种数据类型中较高的级别

3)类型级别从高到低:long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int;当long和int具有相同大小时,unsigned int > long;short和char会被自动提升为int或unsigned int

4)在赋值语句中,计算的最后结果被转换为将要被赋值的那个变量的类型;该过程可能导致提升,也可能导致降级(demotion,将一个值转换成一个更低级的类型)

5)当作为函数的参数进行传递时,char和short会被转换为int,float会被转换为double

升级通常是一个无损害的过程,但是降级可能导致问题:令数据丧失精度

示例代码:

#include <stdio.h>
int main(void)
{
    int i = 1000;
    char c;
    c = i;
    printf("The value of c is %c \n", c);
    return 0;
}

运行结果:

debec7679a594b14827b9b116d461514.png

二、指派运算符

通常应该避免自动类型转换,尤其是避免降级

当需要准确的类型转换时,可以使用指派(cast),即在变量前面放置用圆括号括起来的被希望转换成的类型名,圆括号和类型名一起构成指派运算符(cast operator)

示例代码:

#include <stdio.h>
int main(void)
{
    int a, b;
    float c;
    a = 1.1;
    b = (int) 1.1;
    c = (float) 1;
    printf("%d %d %f \n", a, b, c);
    return 0;
}

运行结果:

8820090e1d8a4f24827188e749b42435.png

三、带有参数的函数

函数中的变量名是局部的。不会与函数外部程序其他地方的相同名称冲突

原型(prototype)是一个函数声明,描述函数的返回值和它的参数

一般如果需要在main()函数中调用某函数,其函数声明需要放在main()函数之前

在需要使实际参数的类型与原型保持一致时,编译器会自动插入类型指派,将实参转换为形参的类型

示例代码:

#include <stdio.h>

int summ(int a, int b); // 原型

int main(void)
{
    int sum1;
    int sum2;
    
    sum1 = summ(10, 20); // 调用1
    sum2 = summ(10.5, 20.8); // 调用2
    printf("sum is %d %d \n", sum1, sum2);
    return 0;
}

int summ(int a, int b)
{
    int res;

    res = a + b;
    return res;
}

运行结果:

7d2cefdaebe64cc5b8813e7967f6efac.png

好的编程习惯之一是不依赖于自动类型转换

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值