服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 一文详解C语言操作符

一文详解C语言操作符

2023-05-15 18:47zyb-绝世剑仙纪宁 C/C++

这篇文章主要详细介绍了C语言的操作符,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 本文将介绍C语言中常用的操作符及其用法,并有大量图解供大家参考和学习,非常详细

一、基础篇

1.算数操作符

+   -   *   /   %   +=   -=  *=  /=  这些操作符是我们编程时候最常用的几个算数操作符

+ - * 等算数操作符就不用再多说了,与正常的数学用法相同,下面是一些常用但是初学者可能不太容易把握、易错的算数操作符

(1)/ 操作符

/:除法,除法在C语言中分为整数除法浮点数除法

整数除法:/d的两个操作数都为整数,计算方法是向下取整

一文详解C语言操作符得到的结果为一文详解C语言操作符

浮点数除法:储存值的变量必须是浮点数, 两个操作数中至少有一个为浮点数,但除数或者被数不一定要用浮点数存储,只需要在计算时进行转化即可

一文详解C语言操作符

一文详解C语言操作符

一文详解C语言操作符

 %.nlf也可以使结果自动四舍五入保留n位小数

(2)%取余操作符

取余运算符得到的是余数,但取余操作符的两个操作数都要为整数

一文详解C语言操作符

 c的值就等于8除以3的余数 2

一文详解C语言操作符

 (3) +=  -=  *=  /=操作符

直接举例子:

a+=2就等同于a=a+2,将a的值加2再赋值给a

a-=2就等同于a=a-2,将a的值减2再赋值给a

*=、/=也是相同的道理

2.单目操作符

单目操作符,顾名思义,单目,就是操作数只有一个的操作符

(1)!  操作符

! 逻辑反操作,将真变为假,将假变为真

在逻辑定义中,0表示假,非0则表示真

一文详解C语言操作符

 在这段代码中,先给i赋初值0,然后在while判断是否进入循环时,!0就是真,进入循环,但为了防止死循环,我们加上一个限制条件,保证只打印5次

一文详解C语言操作符

一文详解C语言操作符

同样,如果while判断条件只有一个0时,则说明为假,不进入循环,打印0次

(2)sizeof 操作符

sizeof(类型名);sizeof()返回无符号的所计算的对象或者类型所占空间的大小,单位是字节

一文详解C语言操作符一文详解C语言操作符

sizeof经常也用来计算数组元素的个数

一文详解C语言操作符

(3)~操作符

~:按位取反操作符,对二进制位进行按位取反,将二进制补码每一位的0变1,1变0。注意,是对补码进行操作,负数要先将原码变为补码,同时取反得到的也是补码,看结果还得再变为原码

一文详解C语言操作符 从图中可以看出,0在按位取反后应该是  -1,同样,在编译器上验证

一文详解C语言操作符

(4)++、--操作符

前置++,前置--:先将变量+1或者-1,再作为表达式的值使用(先++,再使用)

后置++,后置--:先将变量的值作为表达式使用,再将变量+1或者-1(先使用,再++)

用上面的口诀想起来就容易多了

(5)&  取地址操作符

&:取出某个变量、数组、函数等的地址,在比价复杂的代码中,我们经常用指针进行操作,&操作符就可以取出地址赋值给指针变量

一文详解C语言操作符

(6)*  间接访问操作符 

间接访问操作符,也称解引用操作符,操作数地址或指针,可以通过对地址的解引用,找到地址中存储的变量,对变量进行间接操作

一文详解C语言操作符 (7)()强制类型转化

():将一种数据类型的变量强制转化为另一种数据类型

如参数需要一个无符号的整形变量,而你目前所有的是一个整形变量啊,就可以通过强制类型转化转化为组符号的整形,这个经常用于函数参数的优化部分

如:(unsigned int)a   即可将a转化为无符号的整形,同样,强制类型转化尽量要遵守由低到高转化,否则,也会丢失精度

一文详解C语言操作符

3.逻辑操作符

&& 逻辑与 操作符:“同时都要满足”

||    逻辑或 操作符:“满足其中一个即可”

1&&2---->1       0&&1----->0   

1||2   ---->1       0||1----->1

1表示真,0表示假

例:找出1000---2000之间的闰年

闰年:如果year能够被4整除,并且不能被100整除,则year是闰年。或者如果year能够被400整除,则year是闰年,判断闰年就恰好用到了这两个操作符

  1. int year = 0; 
  2.     for (year = 1000; year < 2000; year++) 
  3.     { 
  4.         if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) 
  5.             //判断闰年 
  6.             printf("%d ", year); 
  7.   
  8.     } 

一文详解C语言操作符逻辑操作符这里有一个超级易错点

对于&&来说,如果表达式左边为0,则说明在逻辑上已经为了,那么右边全部的表达就不再进行计算,也不执行。

  1. int i = 0,a=0,b=2,c =3,d=4; 
  2.     i = a++ && ++b && d++; 
  3.     printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); 

a++;---->是先将a的值使用,在对a加1。刚使用的表达式a的值为0,并且在&&的左边,所以后面++b,d++不再计算。

一文详解C语言操作符

同样,对于||来说,如果表达式左边为非0则说明在逻辑上已经为了,那么右边全部的表达就不再进行计算,也不执行。

  1. int i = 0, a = 0, b = 2, c = 3, d = 4; 
  2.     i = a++||++b||d++; 
  3.     printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); 

a++这个表达式的值为0,继续执行,但是++b的值为3,在||操作符的左边,并且在逻辑上已经为真了,所以后面的d++不再计算 

一文详解C语言操作符

4.条件操作符

条件操作符是C语言中唯一一个三目操作符

表达式1如果为真,即计算表达式2,同时表达式2的结果就是三目操作符的运算结果

表达式2如果为假,即计算表达式3,同时表达式3的结果就是三木操作符的运算结果

一文详解C语言操作符

 也可以在编译器里面运行来验证

  1. int a = 0, b= 3, max1 = 0,max2; 
  2.     if (b > a) 
  3.         max1 = b; 
  4.     else 
  5.         max1 = a; 
  6.     //等同于 
  7.     max2 = (b > a) ? b : a; 
  8.     printf("%d %d", max1, max2); 

运算结果当然是max1=3  max2=3

一文详解C语言操作符

5.逗号表达式

逗号表达式,就是用逗号隔开的多个表达式。里面的表达式从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

一文详解C语言操作符

  1. int a = 1; 
  2. int b = 2; 
  3. int c = (a>b, a=b+10, a, b=a+1) 

从左向右一次算a=b+10=12 ; b=a+1=13;然后将这个逗号表达式整体的值(即b=a+1)赋给变量c

即 c=13; 

需要注意的是逗号表达式的每一个表达式都必须从左向右依次计算

6.下标引用,函数调用和结构体成员访问

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

  1. arr[2]=2;//将2赋值给arr[2] 

[ ]就是下标引用操作符,arr和2是[ ]的两个操作数,arr为数组名,2为索引值

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

()可以接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数,函数传参可以传多个参数

一文详解C语言操作符

(3)结构体访问操作符.->

用法:

结构体变量.结构体成员

结构体指针变量->结构体成员

  1. #include <stdio.h> 
  2. struct Stu 
  3.  char name[10]; 
  4.  int age; 
  5.  char sex[5]; 
  6.  double score; 
  7. }; 
  8. void set_age1(struct Stu stu) 
  9.  stu.age = 18;//结构体变量访问结构体成员 
  10. void set_age2(struct Stu* pStu) 
  11.  pStu->age = 18;//结构体指针变量访问结构体成员 
  12. int main() 
  13.  struct Stu stu; 
  14.  struct Stu* pStu = &stu;  
  15.   
  16.  stu.age = 20;//结构成员访问 
  17.  set_age1(stu); 
  18.   
  19.  pStu->age = 20;//结构成员访问 
  20.  set_age2(pStu); 
  21.  return 0; 

7.关系操作符 

>

>=

<

<=

== 用于测试“相等”

!=  用于测试“不相等”

二、进阶篇

1.二进制

(1)二进制的计算

一文详解C语言操作符

 (2)二进制的存储

一文详解C语言操作符

2.移位操作符

移位操作符移动的是二进制的补码,且操作数只能为整数

<< 左移操作符:将二进制位整体向左移动,左边丢弃,右边补零

图为将-15左移1位

一文详解C语言操作符

>> 右移操作符:将二进制位整体向右移动,右边丢弃,左边补符号位

图为将-15右移一位

一文详解C语言操作符

负数学会了,整数就更简单了,因为整数的原码,反码,补码都一样,不用互相转化

3.位操作符

位操作符的操作数必须为整数 

& 按位与: a&b 对应的二进制补码 :有0则为0,同时为1才为1

一文详解C语言操作符

| 按位或: a|b 对应的二进制补码 :有1则为1,同时为0才为0

一文详解C语言操作符

^ 按位异或a^b 对应的二进制补码 :相同为0,不同为1

一文详解C语言操作符

实例1不创建第三个变量,实现两个整数的交换

方法1:

  1.    int a = 2; 
  2. int b = 3; 
  3. printf("交换前:a = %d, b= %d\n", a, b); 
  4. a = a + b; 
  5. b = a - b; 
  6. a = a - b; 
  7. printf("交换后:a = %d, b= %d", a, b); 

这种方法在一般情况下可以,但是当a,b非常大时,a+b可能会超过存储范围(长度大于整形) 

方法2:用按位异或计算

  1. int main() 
  2.     int a = 2; 
  3.     int b = 3; 
  4.     printf("交换前:a = %d, b= %d\n", a, b); 
  5.     a = a ^ b; 
  6.     b = a ^ b; 
  7.     a = a ^ b; 
  8.     printf("交换后:a = %d, b= %d", a, b); 
  9.     return 0; 

一文详解C语言操作符

在解释原因前,先演示一下按位异或的几个规则

a^a=0 详细看图

一文详解C语言操作符

a^0=a 详细看图

一文详解C语言操作符

a^b^a=a^a^b,即按位异或运算满足交换律 详细看图

一文详解C语言操作符

一文详解C语言操作符

 

解释一下原因:a=a^b,然后 b=  (a^b)  ^b =a^0=a,即实现了将a的值赋给了b

              同样:a=a^b,然后a=(a^b)^a=a^a^b=0^b=b,即实现了将b的值赋给了a

实例2:求一个整数存储在内存中的二进制中1的个数

一个数&1可以得到它的最低位(详细参考按位与操作符图解),如果a&1==1,说明a的最低位是1如果a&1==0,说明a的最低位是0,那么思路就清晰了,只需要将a的二进制位多次右移,每次右移后&1得到它的最低位,判断是否为1,为1的话,计数器就++,将32个二进制位尽皆遍历,即可知道共有多少个1

  1. int main() 
  2.   
  3.     int a = 31;//5个1 
  4.     int i = 0; 
  5.     int count = 0; 
  6.     for (i = 0; i < 32; i++) 
  7.     { 
  8.         if (a & 1 == 1) //说明a的最低位是1 
  9.             count++; 
  10.         a >>= 1; 
  11.     } 
  12.     printf("%d", count); 

三、同一操作符的不同类型操作数之间的转化

一文详解C语言操作符

例如:将整形3存到浮点型变量中,没问题。但是,将一个浮点型的数字存到一个整形变量中去,就可能会出现精度丢失问题。这些转化需要我们在写代码的时候自行完成

四、操作符的优先级

C语言操作符的优先级
优先级 运算符符号 名称或者含义            
        1 []、().-> 数组下标引用、圆括号、结构体访问
        2 -、(类型)、++、--、*、&、!、~、sizeof 负号、强制类型转化、自加、自减、解引用、取地址、逻辑非、按位取反、siaeof
3 /、*、% 除号、乘号、取模
4 +、- 加、减
5 <<、>> 左移、右移
6 >、>=、<、<= 大于、大于等于、小于、小于等于
7 ==、!= 等于、不等于
8 &

按位与

9 ^ 按位异或
10 | 按位或
11 && 逻辑与
12 || 逻辑或
13 ?: 条件(三目)运算符

在使用这张表时需仔细核对运算符的符号和名称,但在大多数情况下,我们选择直接将需要优先计算的用圆括号括起来,不过最基本的顺序还是得知道的,总不能一份代码到处都是圆括号吧。

以上就是一文详解C语言操作符的详细内容,更多关于C语言操作符的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/zyb___/article/details/130656086

延伸 · 阅读

精彩推荐