C语言的操作符有很多,有算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号操作符、下标引用、函数调用和结构成员操作符等,那么,它们的具体使用是怎么样的呢?1.算术操作符算术操作符有+、-、*、/、%(整数求余)等。说明:(1)它们的结合性都是从左向右的。(2)+、-、*、/的操作数可以是int型、float型、double型,%的操作数只能是整型。(3)/:如果操作数都是整型,结果为整型。整数的得到并不是四舍五入,而是取整数部分,舍去小数。如果操作数有一个是浮点型,则结果为浮点型。a/b为a除以b的值(4)%:模数,求余符号。a%b得到的是a除以b的余数。2.移位操作符左移操作符:<< 右移操作符:>> 两者对数的运算都是先将数化为二进制数,再进行左右移操作,从而改变原数的值(1)<<移位规则:左边抛弃,右边补0.如:int num=9;int b=num<<2; 9的二进制表示为00000000000000000000000000001001,左移两位为00000000000000000000000000100100,十进制为36.运算规律为:给一个数左移n位,相当于乘以2的n次方。(2)>>移位规则:右移运算分为两种:逻辑移位和算术移位,这取决于编译器。(a)逻辑移位:左边用0填充,右边丢弃。如:int num=-1; int b=num>>1; -1在二进制中应该表示为:11111111111111111111111111111111,右移移位后变为01111111111111111111111111111111,化为十进制改变了原数的符号和值。(b)算术移位(常用):左边用原该数的符号位填充,右边丢弃。如:int num=-1; int b=num>>1; -1在二进制中应该表示为:11111111111111111111111111111111,右移移位后变为11111111111111111111111111111111,化为十进制没有改变原数的符号。注意:对于移位运算符,不要移动负数位。3.位操作符:(1)按位与:& 规则:先化为二进制数,一位一位&,同为1才为1。如:int a=3,b=4; int c=a&b; a的二进制为00000000000000000000000000000011b的二进制为00000000000000000000000000000100那么c的二进制为00000000000000000000000000000000用途:用于求一个数二进制中1的个数。如:int count=0;int m;while(m) { m=m&(m-1);count++;} count表示的是m化为二进制1的个数。(2)按位或: | 规则:先化为二进制数,一位一位|,同为0才为0。规则:先化为二进制数,一位一位|,同为0才为0。如:int a=3,b=4; int c=a&b; a的二进制为00000000000000000000000000000011b的二进制为00000000000000000000000000000100那么c的二进制为00000000000000000000000000000111(3)按位异或:^ 规则:先化为二进制数,一位一位^,相同为假,相异为真。如:int a=3,b=4; int c=a&b; a的二进制为00000000000000000000000000000011b的二进制为00000000000000000000000000000100那么c的二进制为00000000000000000000000000000111用途:交换两个变量的值。int num1=10;int num2=20; num1=num1^num2;num2=num1^num2;num1=num2^num1;num1的二进制为00000000000000000000000000001010,num2的二进制为00000000000000000000000000010100,异或后num1= 00000000000000000000000000011110,异或后num2= 00000000000000000000000000001010,即变为num1.异或后num1= 00000000000000000000000000010100,即变为num2.4.赋值操作符(1)=:赋值操作符的左侧必须为一个变量。可以用在给变量定义并初始化时,也可以用在定义后给变量赋值。如: int a=2; int b; b=1;=自右向左结合(2)复合赋值符:+=、-=、*=、/=、%=、>>=、<<=、&=、|=、^=这些赋值符都是自右向左结合。
5.单目运算符
(1)! 逻辑反操作
用法:int a=10;printf("%d",!a); 结果 :0
(2)- 负值 R-L (表示从右向左结合)
(3)+ 正值 R-L
(4)sizeof 操作数的类型长度(以字节为单位)
如:char arr[]="abcdef"; printf("%d",sizeof(arr));结果输出7,这是因为系统自动给字符串的末尾加上‘\0'.
(5)~ 对一个数的二进制按位取反。
如:int a=5; int b=~a; printf("%d",b);
5的二进制为00000000000000000000000000000101
按位取反为 11111111111111111111111111111010
最高位是1,说明是负数。负数以原码的补码存储在二进制中。原码转换补码的方法是:符号位不变,其它位按位取反,再给末位加1.反过来求:先减1,按位取反,符号位不变。所以b的原码是10000000000000000000000000000110,化为十进制为-6.(6)-- 自减符号
用法:--i :在使用i之前给i减1. i++: 在使用i之后给i加1.
如:int i=5; int m=--i; int n=i--; 那么m的值是4,n的值是5.
(7)++ 自加符号
用法:++i:在使用i之前加1 i++:在使用i之后加1.
如:int i=5; int m=++i; int n=i++;那么m的值是6,n的值是5.
(8)& 取地址 R-L
如:int i; int* p; p=&i; 那么p存放的是i的地址。
(9)* 间接访问操作符
对指针变量前加*可以间接访问指针变量所指向的变量。
如:int num=10; int *p=# *p=20; 那么num的值变为了20.
(10)(类型符) 强制转换类型符
如:int a=1; double b=(double)(a); 这就实现了把a的值先转换为浮点型后再赋给b.
6.关系操作符
有>、<、>=、<=、!=(测试“不相等“)、==(测试相等),多用于判断或循环结构。
注意:在写判断条件时,一定不能把==写成=。=为赋值符号。这些操作符在判断中的值都是1或0,即真或假。
如:int age=0; if(18<=age<=30) printf("成年“); 计算前面18<=age,结果为0,再算后面0<=30,则整个表达式的值为1,输出”成年“。但实际上并不是要这样输出,应改为if((age>=18)&&(age<=30)).
7.逻辑操作符
&& 逻辑与 || 逻辑或
用法:(表达式)&&(表达式) 当两个表达式的值都为真时,结果才为真。
(表达式)||(表达式) 当两个表达式的值都为假时,结果才是假。
当一个大的表达式中有多个逻辑与或逻辑或时,只要可以判断出整个表达式的值,后面的表达式就不再执行。
如:int i=0,a=0,b=2,c=3,d=4; i=a++&&++b&&d++; printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
分析:a++为0,a变为1.0&&任何数都是0,所以后面的表达式不再执行。结果:1,2,3,4
区分逻辑与和按位与:
如: int a=1,b=2;
1&2: 1的二进制是00000000000000000000000000000001,
2的二进制是00000000000000000000000000000010,
那么1&2是11111111111111111111111111111100.
1&&2:左式为1,右式也为1,表达式为1.
8.条件操作符
(表达式1)?(表达式2):(表达式3) 判断表达式1,如果为真,则执行表达式2,否则执行表达式3.
如:c=a>b?a:b; 表示把a和b中的较大值赋给c。
9.逗号表达式
表达式1,表达式2,表达式3……表达式n. 从左向右依次执行,整个表达式的值为最后一个表达式的值。
10.下标引用
[ ] 有两个操作数:一个数组名+一个索引值 如:arr[1]指数组arr下标是1的元素。数组下标的数据类型可以是整型常量或整型表达式。
11.函数调用操作符
()操作数=函数名+参数,第一个操作数是函数名,剩下的操作数是传递给函数的参数。
如:Swap(&a,&b); 表示调用Swap函数,把a的地址和b的地址作为实参传给Swap.
12.访问结构成员的运算符
. 结构体.成员 结构体对象访问成员方式 如:stu.name表示引用结构体stu的name成员。
->结构体指针->成员名 指向结构体对象的指针访问成员方式 如:struct stu; struct stu* pstu=&stu; pstu->age=20;定义了一个结构体变量stu和指向结构体stu的指针变量pstu.pstu->age相当于stu.age,即把20赋给stu.age。
操作符的优先性由高到低分别是:()函数调用 、[ ] 下标引用、. 访问结构成员、-> 访问结构指针成员、++后缀自增、--后缀自减、! 逻辑反、~ 按位取反、+ 表示正值、- 表示负值、++ 前缀自增、-- 前缀自减、* 间接访问、& 取地址、 sizeof 计算字节大小,单位是字节。、(类型) 类型转换