C语言——操作符(预算符)详解

目录

1.操作符的分类

2.二进制和进制转换

3.原码,反码,补码

4.操作符的属性:优先级,结合性

5.表达式求值

1.操作符的分类

  • 算数操作符:+,-,*,/,%
    前面加减乘与日常无区别,重点是/,%
    对于/:若除数比被除数小则得出的是商,若除数比被除数小则得出的是0
    还有两边都是整数的话,那执行的是整数除法,只得出整数
    要得出浮点数则两边至少有一个浮点数
    对于%:这是取模(取余)计算的是整数之后的余数
    且两端只能是整数
  • 移位操作符:<<,>>
    这个操作符是指移(2进制)位的操作符且只能是整数
    比如<<:左移操作符,a变量的一个2进制:00000000000000000000000000001010(a)
    a<<1:则会变成:
    00000000000000000000000000010100(a<<1)
    若未被赋值用a<<1,a的值不会改变。
    这有个口诀:左丢弃,右补0
    还有>>:右移操作符,和左移不同的是有两种:
    1 .算术右移 :与左移大致相同,不过口诀:右边丢弃,左边补原来符号位(2进制最前的1或0,1指负数,0指正数)
    2 .逻辑右移:则是右边丢弃,左边补0.
    最重要的:对移位操作符,不要用移动负数位,这个是标准未被定义:a<<-1
  • 位操作符:&,|,^(进行补码运算)
    &: 按位与
    | : 按位或
    ^ : 按位异或
    ~: 按位取反
    都是二进制位且操作数是整数
    &:口诀:有0则为0,有两个同时为1,则为1就像&&一样有一个错全错,两个同时对才算对:也就是与的意思
    | :口诀:有1则为1,两个同时为0,则为0就像||一样一个对就算对,两个错才是错:也就是或的意思
    ^ : 口诀:相同为0,不同为1.就像对错相反0表示错,1表示对
    比如:a的补码=00000000000000000000000000101010
    ******* b的补码=10000000000000000000000000100010
    *******a&(%,^)b=00000000000000000000000000100010
    支持交换律
    按上面的口诀算
    用法:1.实现两个整数交换。
    2.查一个整数二进制中毒的1个数。
    注意缺点:可读性差。效率差。只能整数交换
  • 赋值操作符:=,+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=
    1 .= 作用是赋值,能让你之前不满意的值进行重新赋值。(注意:=与==不同,==是我们日常用的等号,=是赋值用的。还有a=b=c多重赋值也是可以的,但不建议用,不易于调试
    2 .+=:这一类都属于复合赋值符,复合效果a+=b等价于a=a+b(其余的复合赋值符都是如此
  • 单目操作符:!,++,–,&,*,+,-,~,sizeof,(类型)
    1 .! : 指逻辑反操作(加否的意思)
    2 .++,- -,指的是加和减的意思但方的位置不同有不同的效果:a++后置指先使用后计算,++a前置则相反。如:b=a++,b会等于a,而a则会加1.
    3 .& :指取地址,在scanf等需要用到地址的地方要加&
    4 .~ :指一个数的二进制按位取反将1改为0,0改为1
    5.(+,-):可表示正,负数
    6 . *:指间接访问操作符(解引用操作数)这会在指针中用到(是它通过解析地址找到地址所指向的数 )
    7 .sizeof:操作数的类型长度(以字节为单位)
    sizeof(a),sizeof(int),sizeof a,sizeof int,这四种写法都可以。
    sizeof 只计算类型长度(里面是表达式的话不计算) sizeof a这种写法可以说明他不是函数
    sizeof与数组:sizeof(arr)计算的是数组的大小而数组也算是一种指针:4或8
    8 .(类型)指强制类型转换,比如(int)a,a属于float类型,这时a就转换为int类型比如将3.14改为3
    类型有很多种:int ,float ,double ,short ,char ,long ,longlong ,unsigned,signed,布尔类型
    这里讲一下布尔类型:是在c99中引入的,用来表示真假
    头文件:#include
    -Bool flag=false或true
    可用在return 上相当于0和1
  • 关系操作符:>,>=,<,<=,==,!=
    这些都与我们所熟知的差不多,但有要注意的:==与=的区分,不要写错了
  • 逻辑操作符:&&,||
    &&:指逻辑。当使用&&连接两个表达式时,只有当两个表达式的值都为真(在 C 语言中,非零值表示真,零值表示假)时,整个逻辑与表达式的值才为真;只要有一个表达式的值为假,整个表达式的值就为假。
    |:指逻辑;当使用||连接两个表达式时,只要两个表达式中有一个的值为真,整个逻辑或表达式的值就为真;只有当两个表达式的值都为假时,整个表达式的值才为假。
    这两个都具有短路:&&当计算A && B时,如果A的值为假,那么B将不会被计算
    ||当计算A || B时,如果A的值为真,那么B将不会被计算。
  • 条件操作符:exp1?exp2:exp3(三目操作符)
    比如:a>b?a:b 如果a>b为真那就是a,反之为b(a,b可以为表达式)
  • 逗号表达式:,
    exp1,exp2,exp3:这是表达式且从左往右依次执行,整个表达式是最后的表达式的结果
  • 下标引用 :[]
    [],在数组中能用到。其中含操作数:一个数组名 一个是索引数:arr[10]
  • 函数调用:()
    ()可接受多个操作数,第一个是函数名,其余是传递给函数的参数,如strlen(“abcdef")
  • 结构成员访问. , ->
    访问一个结构体成员:1. .:结构体变量.成员名,2.->:结构体指针->成员名

    //
    struct book
    {
    char name[20];
    char author[30];
    int price;
    }
    int main()
    {
    struct book b1={“万相之王”,“天蚕土豆”,42} ;
    struct book *s=&b1;
    printf(“《%s》 %s %d“,b1.name,b1.author,b1.price);
    printf(”《%s》 %s %d“,s->name,s->author,s->price);
    return 0;
    }

2.二进制和进制转换

进制我们通常听说有2进制、8进制、10进制、16进制
那一个数来说:15.
15的2进制:1111(2进制只有0,1)
15的8进制:17 (8进制0~7)
15的10进制:15 (10进制0~9)
15的16进制:F (0~9 之后是a~f)
2进制转10进制
1101:这里个位表示2的0次,十位表示2的1次,依此类推;
11+02+14+18=13
10进制转2进制
125:这里我们可以用除法来计算:125/2=62余1,再62/2=31余0,依次计算至最后除数大于被除数结束从右往左写余数得125的2进制为1111101
2进制转8进制
因为8进制0~7,只需用三个2进制的数就行 如:2进制的 01101011:01换成1,101换成5,011换成3得8进制01530开头的数字,会被当做8进制
2进制转16进制
依照2进制转8进制,16进制只需要4个2进制的数就行了,还是2进制的01101011,0110换成6,1011换成b16进制表示要在前加0x,所以得0x6b

3.原码,反码,补码

原码:按照一个数(有正有负)得2进制为它的原码
反码:符号位不变(第一个数),其他位按位取反为它的反码
补码:反码+1为它的补码
内存中存储的是补码的2进制,所以在参加移位时,移动的都是补码
补码转为原码有两种方式:1.补码-1,再取反 2.先取反,再+1

4.操作符的属性:优先级,结合性

c语言中操作符有2中属性:优先级和结合性。这两个决定了表达式求值计算顺序
优先级:圆括号()>单目运算符>算术运算符>关系运算符>逻辑运算符>赋值运算符
结合性:例如算术运算符是从左到右计算,单目运算符是从右到左计算。
这个内容有很多建议要记得式下面的(优先级由高到低),其他看图
• 圆括号( () )
• ⾃增运算符( ++ ),⾃减运算符( – )
• 单⽬运算符( + 和 - )
• 乘法( * ),除法( / )
• 加法( + ),减法( - )
• 关系运算符( < 、 > 等)
• 赋值运算符( = )C语言——操作符(预算符)详解_第1张图片

5.表达式求值

1.其由操作符的属性决定计算顺序
2.有时,操作数在求值的时候会需要转换类型求值
隐式类型转换
c语言中自动将一种数据类型转换为另一种数据类型,不需要显式地使用类型转换运算符,使操作数的类型符合运算符的要求。
1.算术运算中的转换
将较低精度的数据类型转换为较高精度的数据类型,以避免数据丢失。
2.赋值运算中的转换
如果值的类型和变量的类型不一致,会将赋值号右边的值转换为左边变量的类型。
3.函数调用中的转换
实参的类型如果和形参的类型不完全匹配,会转换不过转换取决于函数定义的具体要求和编译器的实现。

整型提升

为了获得精度,将一些字符和短整型转为整型,叫作整型提升
这是为了将数据送进cpu计算 因为cpu通常对int类型的数据操作效率更高。

算术转换

不同类型的算术类型(int float 等)进行混合运算,按照以下顺序进行转换:int - > unsigned int - > long - > unsigned long - > long long - > unsigned long long - > float - > double - > long double,转换为更高精度再计算

可能出现的问题

1.数据精度丢失
如:float在转换为int 小数会丢失
2.溢出问题
如:int转为char 因表示范围的问题可能会得到一个不符合预期的值。

你可能感兴趣的:(c语言,开发语言)