操作符详解-C语言

目录

一、操作符分类

二、算术操作符

三、移位操作符

        3.1. 左移操作数

         3.2 右移操作符

四、位操作符

五、赋值操作符

六、单目操作符

七、关系操作符

八、逻辑操作符

九、条件操作符

十、逗号表达式

十一、下标引用函数调用和结构体成员


一、操作符分类

        操作符分为算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式和下标引用、函数调用与结构体成员。

二、算术操作符

        +        -        *        /        %

        除% 操作符外,其他操作符可以作用于整数和浮点数; / 操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数就执行浮点数除法% 操作符的两个操作数必须为整数,返回的是整除之后的余数。

三、移位操作符

        <<        左移操作符

        >>        右移操作符

        移位操作符的操作数只能是整数。

        3.1. 左移操作数

        移位规则:丢弃最左边,在最右边补0

         3.2 右移操作符

        右移分为两种:1.逻辑右移:最左边用0填充,丢弃最右边;2.算数移位:最左边填充该值的符号位,丢弃最右边

        

         不能移动负数位,这是标准为定义,使用会出错。

四、位操作符

        &     按位与        |     按位或        ^按位异或

        操作数必须是整数。

        示例     求一个整数存储在内存中的二进制中1的个数

#include <stdio.h>

//方法1
int main()
{
        int num = 10;

        int count=0; 

        while(num)

        {
                if(num%2 == 1)
                count++;
                num = num/2;
        }
        printf("二进制中1的个数 = %d\n", count);
        return 0;
}

//方法2

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

//方法3

int main()
{
        int num = -1;
        int i = 0;
        int count = 0;
        while(num)
        {
                count++;
                num = num&(num-1);
        }
        printf("二进制中1的个数 = %d\n",count);
        return 0;
}

五、赋值操作符

        =       赋值操作符

         int a=10;

        复合赋值符

        +=        -=        *=        /=        %=        >>=        <<=        &=        |=        ^=

        int x=10;

        x=x+10;

        x+=10;//达到上述同样效果

六、单目操作符

     !  逻辑反操作        -     负值        +     正值          &   取地址        sizeof     操作数类型长度

     ~     对一个数的二进制按位取反        --     前置、后置--        ++前置、后置++

     *        间接访问操作符(解引用操作)     (类型)  强制类型转化

        示例

int main()
{
    int a = -10;
    int* p = NULL;
    printf("%d\n", !2);//0
    printf("%d\n", !0);//1
    a = -a;
    p = &a;
    printf("%d\n", sizeof(a));//4
    printf("%d\n", sizeof(int));//4
    printf("%d\n", sizeof a);//4
    printf("%d\n", sizeof int);//报错
    return 0;
}

int main()
{
      int a = 10;
      int x = a++;//先使用,再增加,这样x的值是10;之后a变成11;--同理
      int y = ++a;//先自增,再使用,这样a的值是11;之后y变成11;--同理
      return 0;

}

七、关系操作符

        >        >=        <        <=        !=(不等于)        ==

八、逻辑操作符

        &&    逻辑与        ||   逻辑或

1&2----->0         按位与
1&&2---->1        逻辑与


1|2----->3          按位或
1||2---->1           逻辑或

        逻辑与特点:在表达式1&&表达式2中,只要表达式1为假(0)结果就为假(0),后面语句不在执行

int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    i = a++ && ++b && d++;
    printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
    return 0;
}

        逻辑或特点:在表达式1 || 表达式2中,只要表达式1为真(非0),结果就为真(非0),后面语句不再执行。

int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    i = a++||++b||d++;
    printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);
    return 0;
}

九、条件操作符

        表达式1?表达式2:表达式3

        如果表达式1为真(非0)结果为表达式2的结果,否则为表达式3的结果。

十、逗号表达式

        表达式1,表达式2,表达式3,表达式4,……

        逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

int main() 
{
    int a = 1;
    int b = 2;
    int c = (a > b, a = b + 10, a, b = a + 1);
    printf("%d", c);
    return 0;
}

        

十一、下标引用函数调用和结构体成员

        1.[ ] 下标引用操作符,操作数:数组名和索引值

        int arr[10];
        arr[9] = 10;

        2.函数调用操作符

        接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

void test1()
{
        printf("hehe\n");
}
void test2(const char *str)
{
        printf("%s\n", str);
}
int main()
{
        test1(); 
        test2("hello bit.");
        return 0;
}

        3.访问结构体成员

        .        结构体名.成员名                ->        结构体指针->成员名

struct Stu
{
        char name[10];
        int age;
        char sex[5];
        double score;
};
void set_age1(struct Stu stu)
{
        stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
        pStu->age = 18;//结构成员访问
}
int main()
{
        struct Stu stu;
        struct Stu* pStu = &stu;
        stu.age = 20;
        set_age1(stu);
        pStu->age = 20;
        set_age2(pStu);
        return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_64668629/article/details/132455053
今日推荐