C语言---运算符及其优先级

目录

自增自减运算符

条件运算符

逗号运算符

符号运算符

位操作运算符

位运算

正数

负数

运算规则

其他运算符

优先级


自增自减运算符

  • ++: 在原来的基础上+1

  • --: 在原来的基础上-1

#include  
int main() 
{ 
    int num = 0; 
    printf("num = %d\n", num); 
    num++; // ++运算符后置 
    // num += 1; num = num + 1; 
    printf("num = %d\n", num); 
    ++num; // ++运算符前置 
    printf("num = %d\n", num); 
    return 0; 
} 

++后置,先用再算

++前置,先算再用

int num = 0; 
int a = 0; 
a = num++; // 后置 
printf("num = %d\n", num); // 1 
printf("a = %d\n", a); // 0 
a = num = 0; 
a = ++num; 
printf("num = %d\n", num); // 1 
printf("a = %d\n", a); // 1

注意:

++num++; ==> (++num)++;

num++ 是一个常量

++后置优先级比前置高,但是前置的运算效率比较高

条件运算符

?:
(表达式1) ? (表达式2) : (表达式3) 
​
判断三个:
( (表达式1) ? (表达式2) : (表达式3) ) ? 
( (表达式1) ? (表达式2) : (表达式3) ) : 
(表达式3) 

先执行表达式1,如果表达式1为真,执行表达式2,为假执行表达式3;

逗号运算符

(表达式1) , (表达式2) , (表达式3)

从左到右,依次执行 取最后一个表达式的值作为整个逗号表达式的值

int a, b, c; 
a = 1; 
b = 2; 
c = 3; 
int num = (++a, a++, b + 10, c = b, a); 
printf("a = %d\n", a); 
printf("b = %d\n", b); 
printf("c = %d\n", c); 
printf("num = %d\n", num);

符号运算符

() []

括号括起来的先算 圆括号比方括号先算

多个括号 从左向右算

多层括号 从内向外算

位操作运算符

位运算

  • 按位与 &

  • 按位或 |

  • 按位非 ~

  • 按位异或 ^

  • 左移 <<

  • 右移 >>

注意:

使用位操作运算符进行运算,都是以二进制补码进行运算,得到的结果也是二进制补码

原码 反码 补码(二进制)

我们知道: 整数可以写成二进制形式(原码)

正数

  • 原码: 整数写成二进制

  • 反码: 和原码相同

  • 补码: 和原码相同

int n = 165; 
// 整数==>正数 
// n:int==>字节(4*8=32) 
// 原码: 0000 0000 0000 0000 0000 0000 1010 0101 
// 反码: 0000 0000 0000 0000 0000 0000 1010 0101 
// 补码: 0000 0000 0000 0000 0000 0000 1010 0101 

负数

  • 原码: 整数写成二进制(符号位)

  • 反码: 保持符号位不变 将原码按位取反

  • 补码: 反码+1

int m = -5; 
// 整数==>负数 
// m:int==>字节(4*8=32) 
// 原码: 1000 0000 0000 0000 0000 0000 0000 0101 
// 反码: 1111 1111 1111 1111 1111 1111 1111 1010 
// 补码: 1111 1111 1111 1111 1111 1111 1111 1011 

从补码怎么求原码?

将补码当做原码,再求一次补码,得到的就是原码

运算规则

  • 按位与 & 同1为1

  • 按位或 | 有1为1

  • 按位非 ~ 取反(符号位参与运算)

  • 按位异或 ^ 同则为0,异则为1

  • 左移 << 向左移动,低位补0

  • 右移 >> 向右移动,高位补符号位

int n = 10; 
// & 双目运算符 同1为1 
n = n & 1;
printf("n = %d\n", n); 
// n: 0000 0000 0000 0000 0000 0000 0000 1010 (补码) 
// 1: 0000 0000 0000 0000 0000 0000 0000 0001 (补码) 
// &: 0000 0000 0000 0000 0000 0000 0000 0000 (补码) ==> 0 
n = 10; 
n = n & -1; 
printf("n = %d\n", n); 
// n: 0000 0000 0000 0000 0000 0000 0000 1010 (补码) 
// -1: 1000 0000 0000 0000 0000 0000 0000 0001 (原码) 
// -1: 1111 1111 1111 1111 1111 1111 1111 1110 (反码) 
// -1: 1111 1111 1111 1111 1111 1111 1111 1111 (补码) 
// &: 0000 0000 0000 0000 0000 0000 0000 1010 (补码:结果) 
n & 1; 
n | 1; 
~n; 
n ^ 1; 
int n = 10; 
n = n << 1; 
printf("n = %d\n", n); 
// n: 0000 0000 0000 0000 0000 0000 0000 1010 (补码) 
// <<1: 0000 0000 0000 0000 0000 0000 0001 0100 (补码) 20 
n = 10; 
n = n >> 1; 
printf("n = %d\n", n); 

使用位运算符,写一个表达式,做以下判断(int类型)

1 判断一个数是否是2的n次方

!(n&(n-1))

2 判断一个数是否是偶数

!(n&1)

3 是否是正数

!(n>>31)

不使用第三方变量,使用位运算符,写一个表达式,交换两个变量的值

int a = 10, b = 20; 
​
// 1 
int c; 
c = a; 
a = b; 
b = c; 
printf("a = %d, b = %d\n", a, b); 
​
// 2 
a = a + b; 
b = a - b; 
a = a - b; 
printf("a = %d, b = %d\n", a, b); 
​
// 3 
a = a^b; 
b = a^b; 
a = a^b; 
printf("a = %d, b = %d\n", a, b);

其他运算符

  • 箭头 ->

  • 点 .

  • 负号 -

  • 取内容 *

  • 取首地址&

  • 求字节数sizeof()

  • 作用域符 ::

优先级

优先级 操作符
1 () [] -> .
::
! ~ ++ --
2 - (unary) * (dereference)
& (address of) sizeof
3 ->* .*
4 * (multiply) / %
5 + -
6 << >>
7 < <= > >=
8 == !=
9 & (bitwise AND)
10 ^
11 |
12 &&
13 ||
14 ? :
15 = += -= etc.
16 ,

你可能感兴趣的:(C,c语言)