1.算数运算符
+ 加法运算 , 一目取正
- 减法运算, 一目取负
* 乘法运算
/ 除法运算
% 取模(求余)
++ 自加 1 a++ , ++a
-- 自减 1
注意:
①减号也是一个负号 表示取反 , a = -100 , -a -> 100
②取模运算的左右两个操作数必须是整型的
③自加,自减既可以操作整型也可以操作浮点, 也可以操作指针
④前缀 : 先进行自加/自减的运算,然后再参与表达式的运算
⑤后缀: 先参与表达式的运算 , 然后再进行自加/自减的运算
int a = 5 ;
int c = 3 ;
printf("5/3 = %d , 5%%3 = %d \n " ,a/c , a%c);
printf("a++:%d\n", a++); // 5
printf("++a:%d\n", ++a); // 7
2.关系运算符
> 大于 a > b 判断a 是否大于b ,该表达式的值为布尔值
< 小于
>= 大于等于 a >= b 判断a 是否大于或者等于b , 该表达式的值为布尔值(表达式中只要a 是大于或者等于b 表达式都为真)
<= 小于等于
== 等于 a == b 判断是否相等
!= 不等于 a != b 判断是否不相等
注意:
①判断两个数是否相等使用的== , 是两个等号 ,而不是一个
②关系运算符的表达式值为布尔值
③在数学中 100< a <200 , 在代码中需要拆开 , a > 100 && a < 200
3.逻辑运算符
! 逻辑反 !(x>9) 如果 x 确实大于 9 则整个表达式为 假 ,反之为真
&& 逻辑与 ( a > 100 && a < 200 ) 该表达式两边同时为真则为真, 如果其中一个为假则整个表达式为 假
|| 逻辑或 ( a > 100 || a < 200 ) 该表达式中其中一个为真则整个表达式为真
注意:
在逻辑与的运算中,如果左边为假则直接判断为假,右边的表达式将不会执行
在逻辑或的运算中, 如果左边为真则表达式直接判断为真, 右边的表达式将不会执行
int a = 100 ;
int b = 200;
if (a < 50 && (b = b + 300)); // 如果左边为假, 则右边不被执行
printf("a=%d , b=%d\n" , a , b ); // a = 100 , b = 200
if (a < 50 || (b = b + 300)); //如果左边为真 ,则右边不被执行
printf("a=%d , b=%d\n" , a , b ); // a = 100 , b = 200
4.位运算符
~ 位逻辑反
int a = 3;
a -> 0000 0000 0000 0000 0000 0000 0000 0011
~a -> 1111 1111 1111 1111 1111 1111 1111 1100
& 位逻辑与 有零得零 --> 清零操作
int a = 3 ;
int b = 5 ;
a:0011
b:0101
a&b : 0001
| 位逻辑或 有一得一 --> 置1 操作
int a = 3 ;
int b = 5 ;
a:0011
b:0101
a|b : 0111
^ 位逻辑异或 相同得0 , 不同得1
int a = 3 ;
int b = 5 ;
a:0011
b:0101
a^b : 0110
int a = 5 ;
int b = 3 ;
int c = a ^ b ;
printf("c:%d\n" , c ); // 6
printf("c^a:%d\n" , c^a ); // 3 --> b
printf("c^b:%d\n" , c^b ); // 5 --> a
<< 左移
int a = 3 ;
a -> 0000 0000 0000 0000 0000 0000 0000 0011
a<<4 ->0000 0000 0000 0000 0000 0000 0011 0000
>> 右移
注意:
①位运算符操作的是操作数的每一个二进制位
②位逻辑反,实际上是对操作数的每一个二进制位进行取反, 0与1之间对调
③异或运算,相同得 0 , 不同得1
④位移, 移出去的丢弃, 空出来的补0
⑤如果移动是一个有符号的数据,并右移运算时 ,移出去丢弃, 空出来补符号位
5.特殊运算符
= 赋值运算符 (左值 = 右值)
① 左值不能是常量 100 = a ;
②不能直接对数组赋值
③可以使用连续赋值 a = b = c = d = 100 ;
int a , b ;
int x[5] ;
100 = a ;// 错, 左值不能是常量
a = 100 ; // 正确, 对变量a进行赋值
x = 123 ; // 错, 数组不可以这么赋值
a = b = 100 ; // 正确 , 连续赋值, 先把100 赋值给 b , 然后再把 b 赋值给a
复合运算符
但左右两边右相同的操作数时,可以使用符合运算符, 使得代码看起来更加简明,且可以在一定程度上提高效率。
// 加减乘除
a += b ;// 相当于 a = a + b ;
a -= b ;
a *= b ;
a /= b ;
// 求余
a %= b ; // 相当于 a = a % b ;
// 位运算
a &= b ; // 相当于 a = a & b ;
a |= b ;
a ^= b ;
a >>= b ;
a <<= b ;
条目运算符(三目运算符)
唯一一个需要三个操作数的运算符(表达式)
语法: 表达式1 ? 表达式2 : 表达式3
如果表达式1的值位真, 则整个表达式的值为表达式2 ,冒号左边
如果表达式1的值位假, 则整个表达式的值为表达式3 , 冒号右边
int a = 100 ;
int b = 250 ;
int max = a > b ? a : b ;
sizeof 运算符
注意该运算符看起来很像一个函数, 不要忘记它实际只是一个运算符
用来计算指定的 变量 或 变量类型 从而得到他在内从中所需要占用的字节
// 求变量类型
printf ("sizof(long):%ld\n" , sizof(long) ); // 计算long 类型的大小 (得知系统的字长)
// 求变量
int a ;
printf ("sizof(a):%ld\n" , sizof(a) ); // 计算变量 a 的大小
// 计算数组的大小
int buf [5];
printf ("sizof(buf):%ld\n" , sizof(buf) ); //计算数组 buf 的大小
// 计算结构体大小
struct node
{
int a ; //4
char b ; // 1
double c ; // 8
};
printf("sizeof(struct node):%ld\n" ,sizeof(struct node) );// 16
return运算符
含义: 退出某一个函数(如果时在主函数遇到return 则退出程序进程结束, 如果不是主函数,则返回被调用的位置)
语法: 必须出现在函数体内部,可以携带对应类型的值,进行返回
int main(int argc, char const *argv[])
{
return 0;
}
逗号表达式
语法 : 表达式1 = (表达式2 , 表达式3 ,表达式4 , … , 表达式n );
int a = 10 ;
int c = 250 ;
// 11 261= 11+250 261
int b = (a++ , a = a + c , a , 300 );
printf("b:%d\n" , b );
printf("a:%d\n" , a );
输出结果:
b:300
a:261
注意:
逗号表达式中, 会从左往右依次运算每一一个表达式
整个表达式的值取决于 最后一个表达式的值
6.运算符优先级
man operator