学习笔记---C语言运算符规则及数据类型的自动/强制转化规则

本文详细介绍了C语言中的运算符规则,包括算术运算符中的除法和取模运算,以及数据类型的自动转换和强制转换。在除法中,遵循“向零取整”原则;取模运算要求两边都是整数。自动转换通常发生在不同类型数据相加时,遵循特定转换规则。强制转换可以确保数据类型符合预期,但可能造成数据丢失。同时,文章还讨论了数学库函数的使用,如平方根函数sqrt()的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总运算符表与运算符的规则(按优先级排列)

 

C语言运算符一览
优先级运算符功能结合方式
1( )    [ ]    ->    .括号,数组,两种结构的成员访问由左向右
2!    ~    ++    --    +    -    *    &    (类型)    sizeof否定,按位否定,增量,减量,正负号,间接,取地址,类型转换,求大小由右向左
3*    /    %乘,除,取模由左向右
4+    -加,减由左向右
5<<    >>左移,右移由左向右
6<    <=    >=    >小于,小于等于,大于等于,大于由左向右
7==    !=等于,不等于由左向右
8&按位与由左向右
9^按位异或由左向右
10|按位或由左向右
11&&逻辑与由左向右
13?=条件由右向左
14=    +=    -=    *=    /=    &=    ^=    |=    <<=    >>=各种赋值由右向左
15,逗号(顺序)由左向右

 

算术运算符

除法 

定义:当参与运算的是两个整数(long , unsigned long , int , unsigned int , short , unsigned short)时,除法遵循“向零取整”原则(事实上,所有将带小数的数据转换成整数的运算,都遵循这个原则)。

示例代码:

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来验证除法运算的“向零取整”规则
*/
int main()
{
    //定义两个int型数字:iNum1,iNum2 以及用于存放运算结果的iAns;
    int iNum1=5,iNum2=3,iAns;
    //使iAns获得iNum1/iNum2的结果;
    iAns=iNum1/iNum2;
    //输出iAns;
    printf("第一次的结果是:%d\n",iAns);


    //改变iNum1和iNum2的值,再次进行运算;
    iNum1=-5;
    iNum2=3;
    iAns=iNum1/iNum2;
    //再次输出iAns
    printf("第二次的结果是:%d",iAns);
    return 0;
}

PS:如以上代码所示,因为iAns为int型数据,所以必须为整数,当5/3的结果带小数时,自动将结果后的小数去掉,使结果向零靠拢。当-5/3的结果是带小数的负数时,同样去掉小数,使结果向零靠拢。注意!基本规则为“向零取整”即:1.988和1.001转换为整数的结果都一样,是1,而所有0.xxx的数值转换为整数的结果都为零!

 

取模运算

定义:取模运算要求运算符两侧的数都是整数!如果使用诸如:2.34%5的算式,程序就会报错。

示例:

 

基本数据类型的自动转换与强制转换

 

自动转换

示例1:

double num=3;

printf("num=%f",num);

PS1:结果是:num=3.000;而非num=3;

PS2:这是因为,在将3赋值给num的过程中。整型的数值自动被转换成了浮点型。

 

示例2:假如是像:2L+32761;或者:10+3.25;再或者:10+3.25f这样的算式,他们将按照以下的规律进行运算

PS1:如图所示,当一个类型的数据要转换成另一个类型的数据时,它将总是顺着指针的方向进行转换

PS2:当一个int型的数据和long型数据相加。结果的数据类型就是long型的。而如果是一个int型的数据和float型的数据相加,结果的数据就是double型的。

PS3:每当在算式中对不同数据类型的数据进行运算时。数据间就会先将自己顺着上图的规则转换成相同的数据类型,然后再进行运算。

 

强制转换:

示例:有时候,会需要得到一个特定数据类型的数值。比如: 希望输出一个double 类型的数据。

int num=3;
printf("num=%f",(double)num);

PS1:这样,运行的结果:num=3.000

PS2:通过在num前加上一对小括号,并在小括号内填上自己想要的数据类型,就能将num强制转换成该类型。

PS3:强制转换的运算优先级为2,在大部分情况下将被优先执行。

PS4:虽然多数情况下,自动类型转换就能满足要求。但为了代码的明了,严谨。我们应该尽量把使用强制类型转换把类型的转变过程表示出来。以便于错误的排查和代码的易于理解。

PS5:类型转换的过程中可能会出现数据的丢失,比如:double num1=3.25; int num2=(int)num1;结果num2的值就是3,这里原本在3后面的数值就在转换的过程中丢失了。

 

数学库函数:

数学库函数列表
函数名函数表达式
三角函数sin    cos    tan
反三角函数asin    acos    atan
双曲函数sinh    cosh    tanh
以e为底的指数函数exp
自然对数函数log
以10为底的对数函数log10
平方根sqrt
绝对值fabs

示例1:

double num1=9.0;
double num2=sqrt(num1);
printf("num2=%f",num2);

PS1:这段代码的输出为:num2=3.0

PS2:可见,平方根函数sqrt将9取平方根为3。

示例2:使用数学库函数之前,必须在程序顶部声明调用

#include <stdio.h>
#include <stdlib.h>
#include <math.h>  //这里要加上一条代码,作为对数学
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值