C语言基础:运算符

运算符

各类数值型数据间的混合运算

  • 整型、实型、字符型数据间可以进行混合运算,如:
    10 - ‘a’ * 1.5
    运算时,参加运算的两个数据如果类型不同,则首先将其类型转换为一致再运算,转换规则是:
    将优先级低的类型转换到优先级高的类型,被称作自动类型转换(隐式转换)。自动类型转换的形式为:
    大类型类型 变量名 = 小类型变量;
    在这里插入图片描述

小贴士:

在混合运算过程中,系统所进行的类型转换并不会改变原数据的类型,只是在运算过程中将其值变成同类型后运算。

int a = 10;
double c = a + 22.5;// 此时 a临时转换为 double,但是a本身并没有改变类型。
// 计算完成,a依然是int类型
  • C语言还提供了强制类型转换(显示转换)运算,可得到一个所需类型的数据,强制类型转换的形式。
    (type)(表达式)
    • (double) a:将a的值转换成double类型

    • (int)(x+y):将x+y的结果转换为int类型

    • (int)x+y:将x的值转换成int类型后与y进行相加

      double a = 2,b = 3;// a,b都是double类型
      double c = (int)a + b; // 首先将a强制转换为int类型,a参与运算的时候,a自动被转换为double类型
      
      double num1 = 12.25;
      int num2 = (int)num1;// 12 高类型转换低类型,有可能会丢失精度。
      
    • (float)(5%3):将5%3的结果转换为float类型。
      特别说明的一点是:在强制类型转换的过程中,并不改变原变量的类型,只是在运算过程中将其值转换类型后再运算。

案例

  • 要求:强制类型转换

    #include <stdio.h>
    
    int main()
    {
        float x;
        int i;
        x = 3.6f;// float类型的变量如果是赋值实型常量,需要跟上f或者F
        i = (int)x;
        printf("x=%f,i=%d\n",x,i);// x=3.600000,i=3 实数转换整数,会丢失小数部分
    }
    

    说明:x任然为float类型,可见强制类型转换并不会改变变量的类型。

C语言运算符和C算术表达式

C运算符
在这里插入图片描述

C表达式

所谓表达式就是将操作对象用运算符连接起来的符合C语法规则的式子。(表达式 = 运算数 + 运算符)

在这里插入图片描述

C语言规定了运算符的优先级和结核性。在表达式求值时,按运算符的优先级的高低次序执行。如果运算符对象两侧的运算符优先级相同,如a +b +c,则按照规定的“结合方向”处理。

C语言运算符优先级

在这里插入图片描述

扩展:自动类型转换与强制类型转换

在C语言中,类型转换分为自动类型转换(隐式转换)和强制类型转换(显式转换)。理解这两种类型转换对于编写正确和高效的代码非常重要。

自动类型转换(隐式转换)

自动类型转换发生在表达式计算过程中,编译器会自动将一种数据类型转换为另一种数据类型,以保证表达式的合法性。这种转换遵循一定的规则:

整数提升(Integer Promotion):

小整数类型(如char和short)在表达式计算时会被提升为int类型,如果int类型无法表示该值,则会被提升为unsigned int。

算术转换(Arithmetic Conversion):

当操作数类型不同时,整数类型会转换为操作数中更“宽”的类型。例如,int和long运算时,int会被提升为long。

有符号和无符号整数混合运算时,有符号整数会被转换为无符号整数。

浮点运算时,整数会被转换为浮点类型(如int和float运算时,int会被转换为float)。

赋值转换:

在赋值操作中,右侧表达式的值会被转换为左侧变量的类型。例如,将double值赋给float变量时,

double值会被截断为float。

强制类型转换(显式转换)

强制类型转换需要程序员明确指定目标类型,使用类型转换运算符(type)进行转换。强制类型转换可能会丢失数据或改变数据的表示方式,因此需要谨慎使用。

语法:

(type) expression;

示例:

#include <stdio.h>

int main() {
    double d = 3.14;
    int i;
    // 强制类型转换
    i = (int)d; // d 被强制转换为 int 类型,i 的值为 3
    
    printf("d = %.2f, i = %d\n", d, i);
    
    return 0;
}

在这个例子中,double类型的变量d被强制转换为int类型,然后赋值给int类型的变量i。

注意事项

  • 数据丢失:强制类型转换可能会导致数据丢失。例如,将double转换为int会丢失小数部分。
  • 精度损失:从高精度类型转换为低精度类型(如从double转换为float)会丢失精度。
  • 符号扩展:对于有符号整数,从短类型转换为长类型时,符号位会被扩展。例如,char转换为int时,如果char是负数,则高位会被填充为1。

总结

  • 自动类型转换是编译器根据上下文自动进行的类型转换,遵循一定的规则。
  • 强制类型转换需要程序员明确指定目标类型,使用(type)语法进行转换。
  • 使用强制类型转换时需要谨慎,以避免数据丢失和精度损失。
  • 理解并正确使用这两种类型转换是编写健壮C语言程序的基础。

扩展:ASCII码表
在这里插入图片描述
在这里插入图片描述

linux下如何查看ASCII?

man ascii
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值