C语言操作符
一、算术操作符 {+ , - , * ,/ , %}
(1)%操作符只能对整数取模,得出的结果是余数。
(2)/ 操作符,如果两个数都为整数则执行整数除法,只要有浮点数就执行浮点数除法。
例:5/ 2 = 2 ; 5.0 / 2 = 2.5
(3)除%操作符以外,其它操作符都能作用于整数和浮点数。
二、移位操作符 {<< ,>>}
其都为二进制移位,且都是对整数的操作。
1、<< 左移操作符(左移一位除2)
移位规则:左边丢弃,右边补0
例:m=10 ——0000 1010——10
m<<1 ——00010100——20
2、>> 右移操作符(右移移位 乘2)
移位规则:(1)算术右移:右边丢弃,左边补符号位
(2)逻辑右移:右边丢弃,左边补0
三、位操作符 {& ,| ,^}
操作数都必须是整数,且是针对二进制数操作的。
1、& 按位与
规则:有 0 为 0 ,全 1 为 1
2、| 按位或
规则:有 1 为 1 ,全 0 为 0
3、^ 按位异或
规则:相同为 1 ,不同为0
例:求一个整数在二进制中,1 的个数。
(1) m&1 == 1 //确定最后一位有 1
(2) m = m >> 1 //将最后一位移除
四、赋值操作符 { = }
可连续使用,从右到左依次执行,但不建议重复使用。
复合赋值符
+= -= *= /= %= >>= <<= &= |= ^=
五、单目操作符
!(逻辑反操作) - + &(取地址)sizeof (操作数长度,以字节为单位)
注:(1)& 在这里不是位运算符,为取地址
例:数组取地址;printf(“%p\n”, arr); //取首地址
Printf(“%p\n”, &arr); //取整个数组的地址
(3) sizeof 不是函数,是单目操作符,使用时可以不带(),但求int型必须带
例如:sizeofarr //求整个数组所占字节的大小
sizeof(1)//求整型数‘1’所占字节的大小
~ (按位取反)(以二进制补码运算)
++ (自增) (1)前置++:i++ 先使用,再加1
(2)++后置:++I 先加1,再使用
-- (自减) 同上
* 间接访问操作符(解引用操作符)
例:int num= 10;
int*p = #
*p= 20;
(类型) (强制类型转换)
例:int num=(int)3.14; //num = 3
六、关系操作符
> ,>= ,< ,<= ,!= ,==
七、逻辑操作符 (判断真假的操作符)
(1)&& 逻辑与(只要前面为假,后面就不用算了)
(2)|| 逻辑或 (只要前面为真,后面就不用算了)
例:int a=0, b=2, c=3, d=4;
i=a++ && ++b && d++; //a=1,b=2,c=3,d=4
j=a++ || ++b || d++; //a=1,b=3,c=3,d=4
printf(“a=%d\n b=%d\n c=%d\n d=%d\n”, a, b, c, d);
八、条件操作符
exp1 ?exp2 :exp3
如果exp1成立,执行exp2;不成立,执行 exp3
例:intmax=a>b ? a : b;
九、逗号表达式
从前往后依次计算,输出结果为最后一个
例:int a=2,b=3;
int c =(a>b,a=b+10,a,b=a+1);//a>b,a=13,a=13,b=14
十、下标引用、函数调用、结构成员
(1)下标、引用操作符 { [] }
一个数组名 + 一个索引值, 但两边的意义处在同一水平线
例: arr[4] 与 4[arr] 相同,但一般不提倡把索引值放在外面
(2)函数调用操作符 {()}
接收一个或多个操作数:第一个操作数是函数名,剩余操作数是传递给函数的参数
(4)访问结构体指针
结构体 . 成员名
结构体指针 ->成员名
十一、表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定,但有些表达式的操作数在求值的过程中需要转换为其他类型。
(1)隐式类型转换:C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
(2)算术转换:如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的类型转换为另一个操作数的类型,否则操作就无法进行
(3)复杂表达式求值的三个影响因素:
a. 操作符的优先级
b. 操作符的结合性
c. 是否控制求值顺序