算术运算符

+ 加法运算,一目取正
- 减法运算,一目取负
* 乘法运算
/ 除法运算
% 取模(求余)
++ 自加 1 a++(再参与表达式的运算,在自加) , ++a (先自加)
-- 自减 1

注意:

  • 减号也是一个负号表示取反, a = -100 , -a -> 100
  • 取模运算的左右两个操作数必须是整型的 (5%3)
  • 自加,自减既可以操作整型也可以操作浮点,也可以操作指针
  • 前缀(++a) : 先进行自加/自减的运算,然后再参与表达式的运算
  • 后缀(a++): 先参与表达式的运算,然后再进行自加/自减的运算
1
2
3
4
5
6
7
int a = 5 ;
int c = 3 ;

printf("5/3 = %d , 5%%3 = %d \n " ,a/c , a%c); //两个%%--->防止识别为格式控制符

printf("a++:%d\n", a++); // 5 -->先打印5,在加一为6
printf("++a:%d\n", ++a); // 7 -->经过上面a++后a已经变成了6,这一步先加一变成7,在打印

关系运算符

> 大于 a> b 判断 a 是否大于 b ,该表达式的值为布尔值
< 小于
>= 大于等于 a >= b 判断 a 是否大于或者等于 b , 该表达式的值为布尔值(表达式中只要a 是大于或者等于b 表达式都为真)
<= 小于等于
== 等于 a == b 判断是否相等
!= 不等于 a != b 判断是否不相等

注意:

  • 判断两个数是否相等使用的==, 是两个等号,而不是一个
  • 关系运算符的表达式值为布尔值
  • 在数学中 100< a <200 , 在代码中需要拆开 , a > 100 && a < 200

逻辑运算符

逻辑反 !(x>9) 如果 x 确实大于 9 则整个表达式为假,反之为真
&& 逻辑与 ( a > 100 && a < 200 ) 该表达式两边同时为真则为真, 如果其中一个为假则整个表达式为 假
|| 逻辑或 ( a > 100 || a < 200 ) 该表达式中其中一个为真则整个表达式为真

注意:

  • 逻辑与的运算中,如果左边为假则直接判断为假,右边的表达式将不会执行

  • 逻辑或的运算中,如果左边为真则表达式直接判断为真,右边的表达式将不会执行

1
2
3
4
5
6
7
8
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

位运算符

~ 位逻辑反

1
2
3
4
int a = 3 ;

a ‐> 0000 0000 0000 0000 0000 0000 0000 0011 //3的二进制数
~a ‐> 1111 1111 1111 1111 1111 1111 1111 1100 //取反

& 位逻辑与 有零得零 --> 清零操作

1
2
3
4
5
6
int a = 3 ;
int b = 5 ;

a:0011 //没写全,实际为:a ‐> 0000 0000 0000 0000 0000 0000 0000 0011
b:0101 //没写全,实际为:b ‐> 0000 0000 0000 0000 0000 0000 0000 0101
a&b : 0001 //没写全,实际为:a&b ‐> 0000 0000 0000 0000 0000 0000 0000 0001

| 位逻辑或 有一得一 --> 置1 操作

1
2
3
4
5
6
int a = 3 ;
int b = 5 ;

a:0011
b:0101
a|b : 0111

^ 位逻辑异或 相同得0 ,不同得1

1
2
3
4
5
6
int a = 3 ;
int b = 5 ;

a:0011
b:0101
a^b : 0110
1
2
3
4
5
6
7
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

<< 左移

1
2
3
4
int a = 3 ;

a ‐> 0000 0000 0000 0000 0000 0000 0000 0011
a<<4 ‐>0000 0000 0000 0000 0000 0000 0011 0000

C-count1

>> 右移

C-count2

注意:

  • 位运算符操作的是操作数的每一个二进制位

  • 位逻辑反,实际上是对操作数的每一个二进制位进行取反, 0与1之间对调

  • 异或运算,相同得 0 ,不同得1

  • 位移,移出去的丢弃,空出来的补0
    如果移动是一个有符号的数据(正负),并右移运算时,移出去丢弃,空出来补符号位

特殊运算符

赋值运算符 = (左值=右值)

  • 左值不能是常量 ,比如100 = a ;

  • 不能直接对数组赋值

  • 可以使用连续赋值 a = b = c = d = 100 ;

1
2
3
4
5
6
7
int a , b ;
int x[5] ;

100 = a ;// 错, 左值不能是常量
a = 100 ; // 正确, 对变量a进行赋值
x = 123 ; // 错, 数组不可以这么赋值
a = b = 100 ; // 正确 , 连续赋值, 先把100 赋值给 b , 然后再把 b 赋值给a

复合运算符

当左右两边有相同的操作数时,可以使用符合运算符,使得代码看起来更加简明,且可以在一定程度上提高效率。

只有以下十种复合运算符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 加减乘除
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 ,冒号右边
1
2
3
4
int a = 100 ;
int b = 250 ;

int max = a > b ? a : b ; //为假,整个表达式的值为表达式3,即b

sizeof 运算符

该运算符看起来很像一个函数,不要忘记它实际只是一个运算符,用来计算指定的变量或变量类型从而得到他在内存中所需要占用的字节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 求变量类型
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 的大小,5乘以int类型的字节4,即为20


// 计算结构体大小
struct node
{
int a ; //4
char b ; // 1
double c ; // 8
};
printf("sizeof(struct node):%ld\n" ,sizeof(struct node) );// 16

return 运算符

含义:退出某一个函数(如果是在主函数遇到 return,则退出程序,进程结束;如果不是主函数,则返回到被调用的位置)

语法:必须出现在函数体内部,可以携带对应类型的值,进行返回

1
2
3
4
int main(int argc, char const *argv[])
{
return 0;
}

优先级与结合性

当一个表达式中同时出现了多个运算符时,根据优先级以及结合性进行运算,比如先乘除后加减

优先级:man operator
C-count3

逗号表达式

语法 : 表达式1 = (表达式2 ,表达式3 ,表达式4 , … , 表达式 n );

1
2
3
4
5
6
7
8
9
10
11
12
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

注意:

  • 逗号表达式中,会从左往右依次运算每一一个表达式
  • 整个表达式的值取决于最后一个表达式的值