运算符

用算术运算符将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式运算对象包括常量、变量、函数等
例如: b / c-1 5 + ‘a’
*运算符的分类:

1、双目运算符:即参加运算的操作数有两个
例:+
a+b
2、单目运算符:参加运算的操作数只有一个
++自增运算符 给变量值+1
—自减运算符
int a=10;
a++;
3、三目运算符:即参加运算的操作数有 3 个
()?():()

1.算数运算符

      • / % += -= = /= %=
        10%3 表达式的结果为 1
        复合运算符:
        a += 3 相当于 a=a+3
        a
        =6+8 相当于 a=a*(6+8)

        2. 关系运算符

        (>、<、= =、>=、<=、!= )
        !=为不等于
        一般用于判断条件是否满足或者循环语句

        3.逻辑运算符

        1、&& 逻辑与
        两个条件都为真,则结果为真
        if((a>b) && (aif(b2、|| 逻辑或
        两个条件至少有一个为真,则结果为真
        if((a>b) || (a3、! 逻辑非
        if(!(a>b))
        {
        }

4.位运算符

十进制转二进制:
方法 除 2 求余法
例: 123 十进制 转二进制

正数在内存中以原码形式存放,负数在内存中以补码形式存放

正数的 原码=反码=补码

原码:将一个整数,转换成二进制,就是其原码。
如单字节的 5 的原码为:0000 0101;-5 的原码为 1000 0101。

反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。
如单字节的 5 的反码为:0000 0101;-5 的反码为 1111 1010。

补码:正数的补码就是其原码;负数的反码+1 就是补码。

如单字节的 5 的补码为:0000 0101;-5 的补码为 1111 1011。
在计算机中,正数是直接用原码表示的,如单字节 5,在计算机中就表示为:0000 0101。
负数用补码表示,如单字节-5,在计算机中表示为 1111 1011。

无论是正数还是负数,编译系统都是按照内存中存储的内容进行位运算。
1、&按位 与
任何值与 0 得 0,与 1 保持不变
使某位清 0
0101 1011&
1011 0100
———————-
0001 0000
2、| 按位或
任何值或 1 得 1,或 0 保持不变
0101 0011 |
1011 0100
———————————————————-
1111 0111
3、~ 按位取反
1 变 0,0 变 1
0101 1101 ~
———————————————————-
1010 0010
4、^ 按位异或
相异得 1,相同得 0
1001 1100 ^
0101 1010
—————————————————————
1100 0110

5、位移
>>右移
<< 左移
注意右移分:逻辑右移、算数右移
(1)、右移
逻辑右移
高位补 0,低位溢出
算数右移
高位补符号位,低位溢出
(有符号数)
A)、逻辑右移
低位溢出、高位补 0
0101 1010 >>3
0000 1011
B)、算数右移:
对有符号数来说
低位溢出、高位补符号位。

1010 1101 >> 3
————————————————————
1111 010 1

0101 0011 >>3
—————————————————————
0000 101 0

总结 右移:
1、逻辑右移 高位补 0,低位溢出
注:无论是有符号数还是无符号数都是高位补 0,低位溢出
2、算数右移 高位补符号位,低位溢出
(有符号数)
注:对无符号数来说,高位补 0,低位溢出
对有符号数来说,高位补符号位,低位溢出

在一个编译系统中到底是逻辑右移动,还是算数右移,取决于编译器

  1. //判断右移是逻辑右移还是算数右移
  2. #include <stdio.h> int main(int argc, char *argv[]) {
  3. printf("%d\n",-1>>3);
  4. return 0;
  5. }
  6. //如果结果还是-1 证明是算数右移判断右移是逻辑右移还是算数右移

(2) 左移<< 高位溢出,低位补 0
5<<1
0000 0101
0000 1010

5.条件运算符号

()?():()
A?B:C;
如果?前边的表达式成立,整个表达式的值,是?和:之间的表达式的结果
否则是:之后的表达式的结果

  1. #include <stdio.h>
  2. int main(int argc, char *argv[]) {
  3. int a; a=(3<5)?(8):(9);
  4. printf("a=%d\n",a);
  5. return 0;
  6. }
  7. //a=8

6.逗号预算符

, (),()

  1. #include <stdio.h>
  2. int main(int argc, char *argv[]) {
  3. int num;
  4. num = (5, 6);
  5. printf("%d\n",num);
  6. return 0;
  7. }
  8. //6

注意逗号运算符的结果是,后边表达式的结果

7.自增自减运算符

i++ i—
运算符在变量的后面,在当前表达式中先用 i 的值,下条语句的时候 i 的值改变

  1. #include <stdio.h>
  2. int main() {
  3. int i=3;
  4. int num;
  5. num=i++;
  6. printf("num=%d,i=%d\n",num,i);//num=3 ,i=4
  7. return 0;
  8. }
  9. //num=3,i=4

++i 先加 ,后用

  1. #include <stdio.h>
  2. int main() {
  3. int i=3;
  4. int num;
  5. num=++i;
  6. printf("num=%d,i=%d\n",num,i);//num=4,i=4
  7. return 0;
  8. }
  9. //num=4,i=4
  1. #include <stdio.h>
  2. int main(int argc, char *argv[]) {
  3. int i=3;
  4. int num;
  5. num = (i++)+(i++)+(i++);
  6. printf("num=%d\n",num);
  7. return 0;
  8. }
  9. //num=9
  1. #include <stdio.h>
  2. int main(int argc, char *argv[]) {
  3. int i=3;
  4. int num;
  5. num = (++i)+(++i)+(++i);
  6. printf("num=%d\n",num);
  7. return 0;
  8. }
  9. //windows中num=18 Linux中num=16

8.算符优先级及结合性

运算符优先级
在表达式中按照优先级先后进行运算,优先级高的先于优先级低的先运算。
优先级一样的按结合性来运算

  1. int a;
  2. a=2+5+3*4-6

运算符结合性
左结合性:从左向右运算

  1. int a;
  2. a=2+3+9+10;

右结合性:从右向左运算

  1. int a,b,c,d;
  2. a=b=c=d=100;

优先级和结合性表:
image.png
image.png
注:建议当表达式比较复杂的时候,用()括起来,括号的优先级最高,优先算括号里的。
这样也防止写错表达式。

  1. int a;
  2. a=(2+3)*6+(9*3)+10;