一篇搞定C语言操作符(详解含示例)

简介: 一篇搞定C语言操作符(详解含示例)

一.操作符是什么?



指令系统的每一条指令都有一个操作符,它表示该指令应进行什么性质的操作。不同的指令用操作符这个字段的不同编码来表示,每一种编码代表一种指令。


基本特征

语义

每个操作符都有自己的语义,具体取决于它所操作的类型。

优先级

每个操作符都有优先级。


结合性

每个操作符都有结合性。  操作符的结合性定义了操作符对操作数执行操作的顺序,例如:右结合性表示该操作符对其操作数从右向左执行操作。


二.操作符的分类



操作符分类

算数操作符  +      -      *      /     %
移位操作符 <<     >>     
位操作符 &      |        ^     
赋值操作符 =      +=      -=     *=     /=      ……

单目操作符
!   sizeof    +      -      ~     &     *   ……
关系操作符 >        <        >=      <=      !=
逻辑操作符 &&      ||

条件操作符
?      :
逗号表达式 ,
下标引用,函数调用和结构体成员 [ ]       ()      .      ->


三.操作符各类详解



1.算数操作符(+     -     *     /     %)


(1)优先级:


1ad96c4548284dd59ae890c51ce17eb4.png

(2)除法操作符(/)的计算规则及注意事项


这里重点要讲的是除法的计算


2.1除法计算分类

(1)整数除法 (除号两端都是整数)

(2)浮点数除法   (两端有一个是小数就执行浮点数除法)


2.2计算规则及注意事项

注:除法中,被除数不能等于0

整数除法的结果只保留了整数部分,小数点后的直接舍去    如 15 / 5 =3       3 / 2 =1

注意:这里不是四舍五入,是将小数部分直接舍去哦!

浮点数除法的结果整数和小数部分都保留,结果精度一般是小数点后6位

例如    3 / 2.0 =1.500000  

          3.0 / 2 = 1.500000

          3.0 / 2.0 = 1.500000

注意:两端至少有一个为小数即可


(3)取余操作符(%)的计算规则


注:取余操作符的两端都必须为整数

3.1计算规则:

例如     5 % 2 = 1 (5除2等于2余数为1)

           99 % 10 = 9


(4)算术操作符示例代码


int main()
{
  printf("%d\n",3+5);
  printf("%d\n",4-2);
  printf("%d\n",5*7);
  printf("%d\n",15/5);
  printf("%d\n",3/2);
  printf("%d\n",99%10);
  return 0;
}


输出:

037abc1179ba414c93475464891de06c.png


2.移位操作符(>>   <<)


(1)优先级:

ce1c59bc641040ad839fb6ce58ac0af4.png

(2)计算规则及注意事项


注意:移位操作符的操作数只能是整数

2.1计算规则

首先移位操作符移动的是操作数的补码二进制信息

(1)右移操作符  

右移操作符运算及示例:

d76f997ae98648be9fc7dfa2b549bc4c.png


注意:移位操作符操作数本身不会发生改变 ;例如上述的   b = a>>1

其中b=7  ;而a 本身还是 15


2.2左移操作符

计算规则:左边丢弃,右边补0

8dfe7bd48fcc4ca4a5ca4202e6f95cc3.png

(3)移位操作符示例代码


int main()
{
  int a = 15;
  int b = -15;
  int c = 6;
  int m = -6;
  int d = a >> 1;
  int e = b >> 1;
  int f = c << 1;
  int g = m << 1;
  printf("%d %d %d %d \n",d,e,f,g);
  return 0;
}


输出:

32b12f2465804595a7eba570fb5ce7a3.png


3. 位操作符(&  ^  |)


注意:和移位操作符一样,也是操作二进制的补码


(1)优先级fa997f52407f4ab6a950984542fab6f7.png

(2)计算规则及注意事项


注意:他们的操作数必须是整数

(1)按位与&

计算规则

两个数对应的二进制有0则为0,全1才为1;

8438099a5687446ebded56e5eded2146.png

(2)按位异或(^)

计算规则

两个数对应的二进制位相同为0,相异为1;

b93ac24c1913413a8b9b9c1d2db2d6e6.png

常见结论:a^0=a;

                 a^a=0;

                 a^b^a=b;  (支持交换律)

                 a^a^b=b;


(3)面试例题


题目描述:不创建临时变量交换a,b的值

参考代码:

#include <stdio.h>
int main()
{
  int a = 10;
    int b = 20;
    printf("交换前:a = %d b = %d\n", a,b);
    a = a^b;
    b = a^b;
    a = a^b;
    printf("交换后:a = %d b = %d\n", a,b);
  return 0;
}


(3)按位或 ( | )

计算规则

两个数对应的二进制有1则为1,全0才为0;

8caa1455a46647e59dbd137cbaa40f1e.png

(4)位操作符示例代码


int main()
{
  int a = 3;
  int b = -5;
  printf("a=%d b=%d\n",a,b);
  printf("a&b=%d\n",a&b);
  printf("a|b=%d\n",a|b);
  printf("a^b=%d\n",a^b);
  printf("a^a=%d\n",a^a);
  printf("a^0=%d\n",a^0);
  printf("a^b^a=%d\n",a^b^a);
  printf("a^a^b=%d\n",a^a^b);
  return 0;
}


输出


ad33cce7082843e589f395491590ab85.png

4.赋值操作符( =   +=   -=    *=   /=   %=  ………)

(1)优先级(赋值操作符的优先级都很低)

2187844632754f0cb696788ee5f3c1ba.png

(2)运算规则


他们的运算规则基本相同;


赋值操作符

符号 运算规则
a=3 3赋给a
a+=3 a=a+3
a-=3 a=a-3

a*3
a=a*3
a/=3 a=a/3
a%=3 a=a%3
a<<=3 a=a<<3
a>>=3 a=a>>3
a&=3 a=a&3
a|=3 a=a|3
a^=3 a=a^3


(3)赋值操作符示例代码


int main()
{
  int a = 9;
  printf("a=%d\n",a);
  printf("a+=3的值为%d\n",a+=3);
  printf("a-=3的值为%d\n",a-=3);
  printf("a*=3的值为%d\n",a*=3);
  printf("a/=3的值为%d\n",a/=3);
  printf("a%=2的值为%d\n",a%=2);
  printf("a|=5的值为%d\n",a|=5);
  printf("a&=3的值为%d\n",a&3);
  printf("a^=2的值为%d\n",a^2);
  printf("a<<=1的值为%d\n",a<<=1);
  printf("a>>=1的值为%d\n",a>>=1);
  return 0;
}


输出:

b12e097423b54c1cbf6d011d61c8b140.png

5.单目操作符


(1)单目操作符的介绍

单目操作符:只有一个操作数


(2)单目操作符有哪些?

单目操作符


逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)

~
对一个数的二进制按位取反
-- 前置,后置--
++ 前置,后++
* 间接访问操作符(解引用)
(类型) 强制类型转换


注意:sizeof不是函数,是操作符

       计算的是类型创建的大小(单位字节)

(3)sizeof和数组

28db885d54c94143978edff311c30379.png

(4)sizeof与数组示例代码:

int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  char ch[6] = { 'a','b','c','d','e','f' };
  int a = sizeof(arr);                            //40
  int b = sizeof(ch);                             //6
  printf("int类型的大小%d\n",sizeof(int));         //4
  printf("char类型的大小%d\n",sizeof(char));       //1
  printf("数组arr的大小%d\n",a);                   //40
  printf("数组ch的大小%d\n",b);                    //6
  return 0;
}


输出:2e823ebf399e4c438d5e7d3bf621b1a8.png


6.关系操作符(<    >    <=    >=)


(1)优先级

f438d0aa207040c8beddc368b6dca10f.png

(2)关系操作符的介绍

bc88b1e0726a477d92f2840d3c61d471.png

(3)运算结果值

关系运算符的值只能是0或1。

关系运算符的值为真时,结果值都为1。

关系运算符的值为假时,结果值都为0。


(4)注意事项

(1)前4种关系运算符的优先级别相同,后两种也相同。前四种高于后两种。

(2)关系运算符的优先级低于算术操作符。

(3)关系运算符的优先级高于赋值运算符。


(5)示例代码

int main()
{
  printf("%d\n",(-3>2));
  printf("%d\n",(3>=3));
  printf("%d\n",(2)&&(-1));
  printf("%d\n",(2<=9));
  printf("%d\n",(4<=4));
  return 0;
}


输出:

d045f85940c2422d80dae27f199c7db9.png


7.逻辑操作符(&&   ||)


(1)什么是逻辑操作符?

逻辑操作符是用于结合bool值测试复合条件的操作符。


(2)优先级a517146aaafa439386092a67dd1a87fb.png

(3)计算规则


逻辑与&&:()&&()  两个全为为真才为真,其中一个为假即为假;

逻辑或  |  :()|()     两个为假才为假,其中一个为真即为真;


注意:(非0为真,0为假)


(4)计算机在计算时的特点:


1.为真电脑计算的结果为1,为假计算的结果为0;

例如:int  a  = (3>4)       a的结果为0;a=0;

          int  a = (3>2)        a的结果为1;a=1;

2..当&&操作符左边的为假,右边的都不用计算了;

(因为&&操作符有一个为假即为假)

例如 (3<2)&&(4>3)    左边条件为假   ,右边就不用算了,整个式子的结果就是假;

3..当||操作符左边为真,右边也不用计算了;

(因为||操作符其中一个为真即为真)


例如   (3>2)||(4<9)     左边条件为真,右边就不用计算了,整个式子的结果就为真;


(4)例题


1.题目描述:printf(“%d”,(a=2)&&(b=-2));的输出结果()

答案:1

2.题目描述:int x=3,y=4,z=1;则表!(x+y)+z-1&&y+z/2的值为()

答案:0

解析:因为式子中运算符的优先级为  ()>  !  >  /  > +

所以左边的式子x+y=7(非0,为真),但是运算符!,结果变为假,所以结果为0;

0+z-1=0;左边为0,又因为是&&操作符,所以整个式子结果为假,即为0;

代码测试


int main()
{
  int a = 0;
  int b = 0;
  int x = 3;
  int y = 4;
  int z = 1;
  printf("%d\n",(a=2)&&(b=-2));
  printf("%d\n",!(x+y)+z-1&&y+z/2);
  return 0;
}


输出:

7cb58cdc810444a38cee0cf1a0ed0049.png


8.条件操作符(  :    ?  )


(1)优先级

d8b9743a0230403b8b828e0d87cddf17.png

(2)运算规则:


表达式为:表达式1:表达式2:表达式3

先计算表达式1的值,若表达式1为真,则执行表达式2;若表达式1为假,则执行表达式3;

例如;


max = (x > y) ? x : y           (就是把x,y中较大的赋给max)

min =  (x < y) ? x : y              (就是把x,y中较小的赋给min)


(3)代码示例


int main()
{
  int x = 4;
  int y = 3;
  int a = 2;
  int b = 6;
  int max = ((x > y) ? x : y);
  int min = ((a < b) ? a : b);
  printf("x=%d y=%d a=%d b=%d\n",x,y,a,b);
  printf("max=%d\n",max);
  printf("min=%d\n",min);
  return 0;
}


输出:

aa7c518a2de94490b7d8081a6365a06a.png


9.逗号表达式(   ,  )  


(1)优先级


逗号表达式的优先级最低

99ea372dddb846bd8bed7a4e38584d9d.png

(2)逗号表达式的介绍及运算规则


逗号表达式,是c语言中的逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值


如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;a=(a=3*5,a*4)的值是60,其中(a=3*5,a*4)的值是60, a的值在逗号表达式里一直是15,最后被逗号表达式赋值为60,a的值最终为60。


例题:


例题:(a = 3,b = 5,b+ = a,c = b* 5),求逗号表达式的值?

答案:40


解析:前两个表达式只是赋值,从第三个开始计算,b+=a,即b=b+a,即b=5+3,b=8,求最后一个表达式,c=b*5=8*5=40.因为逗号表达式的值是最后一个表达式的值,所以整个逗号表达式的值为40,其他各变量最后的值依次为:a=3,b=8,c=40


10.下标引用,函数调用和结构体成员  ( [ ]    ()   .   -> )


(1)优先级

799ea57a541c4db8b4219e23dcf3cb07.png

(2)下标引用操作符( [ ])


操作数:一个数组名+一个引索值

如:

arr[10]={0};//创建数组

arr[9]=10;//使用下标引用操作符

[ ]的两个操作数是arr和9


(3)函数调用操作符(  ( ) )


1.操作数

函数名   +   函数参数

如   strlen("abc")      操作数为     strlen    "abc"


注意:函数的参数可能有多个,所以对于函数调用操作符()来说,操作数至少有1个(函数可以没有参数,如:test())

2.示例代码

#include <string.h>
void test()
{
  printf("hello bit!");
}
int main()
{
  char ch[] = "abc";
  int len = strlen(ch);
  printf("%d\n",len);
  test();
  return 0;
}


(4)结构体成员访问操作符(  ->     .  )


.      结构体变量.成员名

->    结构体指针->成员名

示例代码

struct book
{
  char  name[20];
  char  author[20];
  float price;
};
void Print(struct book * p)
{
  printf("%s %s %.1f\n",p->author,p->name,p->price);
}
int main()
{
  struct  book a = { "小明","c语言",33.9f };
  Print(&a);
  printf("%s %s %.1f",a.author,a.name,a.price);
  return 0;
}

输出:

4451b587a58f4050b3d8a48b121a21ec.png


四.操作符优先级表(含记忆规律)



1.运算符优先级和结合性一览表


a2be9e5534ab43b59bbfd9a2dcd2c7b6.png


2.表中规律:


  1. 结合方向只有三个是从右往左,其余都是从左往右。
  2. 所有双目运算符中只有赋值运算符的结合方向是从右往左。
  3. 另外两个从右往左结合的运算符也很好记,因为它们很特殊:一个是单目运算符,一个是三目运算符。
  4. C语言中有且只有一个三目运算符。
  5. 逗号运算符的优先级最低,要记住。
  6. 此外要记住,对于优先级:算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符。逻辑运算符中“逻辑非 !”除外。


谢谢观看!!!

目录
相关文章
|
5月前
|
存储 C语言
【C语言】基础刷题训练4(含全面分析和代码改进示例)
【C语言】基础刷题训练4(含全面分析和代码改进示例)
|
1月前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
92 8
|
1月前
|
C语言
【C语言】逻辑操作符详解 - 《真假美猴王 ! 》
C语言中有三种主要的逻辑运算符:逻辑与(`&&`)、逻辑或(`||`)和逻辑非(`!`)。这些运算符用于执行布尔逻辑运算。
79 7
|
5月前
|
存储 C语言 索引
【C语言篇】操作符详解(下篇)
如果某个操作数的类型在上⾯这个列表中排名靠后,那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
90 0
|
5月前
|
程序员 编译器 C语言
【C语言篇】操作符详解(上篇)
这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式。
319 0
|
3月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
59 10
|
3月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
225 1
|
3月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
200 0
|
5月前
|
C语言
C语言操作符(补充+面试)
C语言操作符(补充+面试)
52 6
|
5月前
|
存储 编译器 C语言
十一:《初学C语言》— 操作符详解(上)
【8月更文挑战第12天】本篇文章讲解了二进制与非二进制的转换;原码反码和补码;移位操作符及位操作符,并附上多个教学代码及代码练习示例
68 0
十一:《初学C语言》—  操作符详解(上)