C语言操作符和表达式

1.算数操作符

    +
    -
    *
    /     // 5 / 2 = 2
    %     // 5 % 2 = 1

注:
1.除%操作符之外,其他的几个操作符均可作用与整数和浮点数,但需要注意结果打印的格式和精度缺失。
2.对于/操作符,如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法。
3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。

2.移位操作符

左移操作符 <<

移位规则:左边抛弃、右边补零

    int num = 10;    //00000000000000000000000000001010  num在内存中的二进制
    num = num >> 1;  //00000000000000000000000000010100  num左移一位的结果

右移操作符 >>

1.算数移位(常用)

移位规则:左边用原该值的符号位填充、右边丢弃

2.逻辑移位

移位规则:左边用0补充、右边丢弃

    int num = -1;  //11111111111111111111111111111111  内存中-1的补码
    //算数右移  11111111111111111111111111111111  左边用原该值的符号位填充
    //逻辑右移  01111111111111111111111111111111  左边用0补充

3.位操作符

    &    //按位与    两数补码同位比较,同为1为,其余为0
    |    //按位或    两数补码同位比较,有1就取1,都为0才取0
    ^    //按位异或  两数补码同位比较,相同取0,不同取1

注:操作数必须是整数

    #include <stdio.h>
    int main()
    {
        int num1 = 1;   //00000000000000000000000000000001
        int num2 = 2;   //00000000000000000000000000000010
        num1&num2;      //00000000000000000000000000000000      
        num1|num2;      //00000000000000000000000000000011
        num1^num2;      //00000000000000000000000000000011
    }

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

    #include <stdio.h>
    int main()
    {
        int num = -1;
        int i = 0;
        int count = 0;    //计数
        for (i = 0; i < 32; i++)
        {
            if (((num >> i) & 1) == 1)
            count++;
        }
        printf("二进制中1的个数 = %d\n", count);
        return0;
    }

4.赋值

复合赋值符

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

a += 1,即a = a + 1

5.单目操作符

//逻辑反操作    对非0的数反为0,对0取反为1
    -         //负值
    +         //正值
    &         //取地址
    sizeof    //操作数的类型长度(以字节为单位)
    ~         //对一个数的二进制按位取反
    --        //前置、后置--
    ++        //前置、后置++
    *         //间接访问操作符(解引用操作符)
    (类型)    //强制类型转换

sizeof和数组

    #include <stdio.h>
    void test1(int arr[])
    {
        printf("%d\n", sizeof(arr));    //4
    }
    void test2(char ch[])
    {
        printf("%d\n", sizeof(ch));    //4
    }
    int main()
    {
        int arr[10] = {0};
        char ch[10] = {0};
        printf("%d\n", sizeof(arr));    //40
        printf("%d\n", sizeof(ch));     //10
        test1(arr);
        test2(ch);
        return 0;
    }

++和- -运算符

前置++、- -
    int a = 10;
    int x = ++a;    //x = 11    先对a进行自增,然后使用a
    int y = --a;    //y = 10    先对a进行自减,然后使用a
后置++、- -
    int a = 10;
    int x = a++;    //x = 10  a = 11  先使用a,然后对a进行自增
    int y = a--;    //y = 11  a = 10  先使用a,然后对a进行自减
解引用操作符
    int a = 10;
    int p = &a;    //定义指针p
    p = 20;        //解引用操作

6.关系操作符

    >
    >=
    <
    <=
    !=    //用于测试“不相等”
    ==    //用于测试“相等”

注:在编程的过程中==和=写错,导致错误

7.逻辑操作符

    &&    //逻辑与
    ||    //逻辑或

注:逻辑与中,一旦出现0,则为0,后面的不再计算

逻辑与和按位与、逻辑或和按位或
    1&2 ------> 0
    1&&2 -----> 1

    1|2 ------>3
    1||2 ----->1

8.条件操作符

    exp1 ? exp2 : exp3

    a > 5 ? b = 3 : b = -3

9.逗号表达式

exp1, exp2, exp3, ...expn

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

    int a = 1;
    int b = 2;
    int c = (a > b, a = a+10, a, b = a + 1);    //逗号表达式

10.下标引用、函数调用和结构成员

1.[ ]

操作数:一个数组名 + 一个索引值

扫描二维码关注公众号,回复: 127576 查看本文章
    int arr[10];    //创建数组
    arr[9] = 10;    //使用下标引用操作符
    //[]的两个操作数是arr和9

2.( )

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

    #include <stdio.h>
    void test1()
    {
        printf("哈哈\n");
    }
    void test2(const char *str)
    {
        printf("%s\n", str);
    }
    int main()
    {
        test1();            //使用()作为函数调用操作符
        test2("hello");     //使用()作为函数调用操作符
        return 0;
    }

3.访问一个结构成员

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

    struct Stu
    {
        char name[10];
        int age;
    }
    int main()
    {
        struct Stu stu;
        struct Stu* pStu = &stu;    //结构体成员访问
        stu.age = 20;               //结构体成员访问
        pStu->age = 20;             //结构体成员访问
        return 0;
    }

11.表达式求值

隐式类型转换

c的整型算数计算总是至少以缺省整型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通类型,这种转换被称为“整型提升”。

算术转换

寻常算术转换
long double
double
float
uunsiged long int
long int
unsigned int
int

如果某个操作数的类型在上面的列表中排名较低,那么首先要转换为另一个操作数的类型后执行运算。

    float f = 3.14;
    int num = f;    //隐式转换,会有精度丢失

猜你喜欢

转载自blog.csdn.net/lw13572259173/article/details/79750221