C语言基本操作符

目录

    • 目录
    • 算术操作符
    • 移位操作符
      • 左移
      • 右移
        • 算术右移(通常使用算术)
        • 逻辑右移
      • 移位实例
    • 位操作符
    • 赋值操作符
    • 复合赋值操作符
    • 单目操作符
    • 关系操作符
    • 逻辑操作符
    • 条件操作符

算术操作符

  • + - * / %
  • + - * / 用于整数和浮点数运算
  • % 只用于整数运算

移位操作符

  • << >>

左移

  • 左边丢弃,右边补0
  • 原值不会被改变
  • 移n位,相当于乘2的n次方
    C语言基本操作符_第1张图片

右移

算术右移(通常使用算术)

  • 右边丢弃,左边补齐符号位
    C语言基本操作符_第2张图片

逻辑右移

  • 右边丢弃,左边补0
    C语言基本操作符_第3张图片

移位实例

//求整数中二进制的个数
int main()
{   
    int count = 0;
    int num = -1;
    int i = 0;
    for (i = 0; i < 32; i++)
    {
        if ((num >> i) & 1 == 1)
        count ++;
    }
    printf("%d\n", count);
    system("pause");
    return 0;
}

位操作符

  • & | ^
  • & 按位与,有0为0,全1为1;
  • | 按位或,有1为1,全0为0;
  • ^ 按位异或,相异为1,相同为0;
  • 实例如下:
int main()
{
    int a = 1;
    int b = 2;
    printf("%d\n", a & b);  //0
    printf("%d\n", a | b);  //3
    printf("%d\n", a ^ b);  //3
    system("pause");
    return 0;
}
//没有中间变量,交换两个数
//a ^ a = 0; a ^ 0 = a;
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d%d", &a, &b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("a = %d b = %d\n", a, b);
    system("pause");
    return 0;
}

赋值操作符

  • =
  • 对于连续的赋值,分开写易于调试和理解
  • 例子如下:
int weight = 129; //初始化
weight = 110;     //赋值

int a = 10;
int b = 20;
int c = 30;
c = a = b + 10;
//分开写
a = b + 10;
c = a;

复合赋值操作符

  • += -= *= /= %= >>= <<= &= |= ^=
  • 这些运算符都可以写成复合的形式
a = a + 10;
a += 10;

单目操作符

  • ! - + & sizeof ~ -- ++ * (类型)
  • 它们的作用如下
操作符 作用
逻辑反,表真假
+ - 表示正负
& 取址
sizeof 求操作数大小(单位字节)
~ 按位取反
++ - - 前置,后置++,- -
* 解引用
(类型) 强制类型转换
//!
int main()
{
    int flag = 10;
    printf("%d\n", !flag);  //0
    return 0;
}
// &
int a = 0;
printf("%p\n", &a);   //取a的地址

int arr[10] = {0};
printf("%p\n", arr);   //取首元素地址
printf("%p\n", arr+1);  //取第二个元素地址
printf("%p\n", &arr);   //数组地址
printf("%p\n", &arr+1);  //数组后面的地址
// sizeof 不是函数
int a = 10;
printf("%d\n", sizeof(a));   //4
printf("%d\n", sizeof(int));  //4

int arr[10] = {0};
printf("%d\n", sizeof(arr));   //40
printf("%d\n", sizeof(int [10]));  //40  int [] 为数组类型
// ++ --
int main()
{
    int a = 10;
    int b = a++;   //先使用后++,b = 10, a = 11;
    int c = a--;  //先使用后--, c = 11, a = 10;
    return 0;
}
int main()
{
    int a = 10;
    int b = ++a;  //先++后使用,a = 11, b = 11;
    int c = --a;  //先--后使用,a = 10, b = 10;
    return 0;
}

关系操作符

  • > >= < <= != ==
  • 这些操作符比较简单,但要注意 ==
int main()
{
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        if (i = 3)           //程序死循环,条件一直为真
        printf("hahah\n");
    }
    return 0;
}
//上面的程序可以改为
int main()
{
    int i = 0;
    for (i = 0; i < 5; i++)
    {
        if (3 == i)           //如果写成if(3 =i)程序会报错,变量不能赋给常量
        printf("hahah\n");
    }
    return 0;
}

逻辑操作符

  • && ||
  • && 表达式为假,就不判断后面的表达式;
  • || 表达式为真,就不判断后面的表达式;
int main()
{
    int i = 0;
    int a = 0;
    int b = 2;
    int c = 3;
    int d = 4;
    i = a++ && ++b && d++;  //a = 0; 条件为假,不判断后面的表达式
    printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);  
    return 0;
    //结果为a = 1;b = 2; c = 3; d = 4
}

条件操作符

  • exp1 ? exp2 : exp3
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);
    if (a > 5)
        b = 3;
    else
        b = -3;
    printf("%d\n", b);
    return 0;
}
//上面的程序可以写成:
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d", &a);
    b = (a > 5)? 3 : -3;
    printf("%d\n", b);
    return 0;
}

你可能感兴趣的:(C)