• C语言学习记录(三)之操作符



    一、 算数操作符

    操作符解释说明
    +加法操作符a+b=c
    -减法操作符a-b=c
    *乘法操作符a*b=c
    /除法操作符a/b=c
    %取余操作符a%b=c,取余操作符的左右都必须是整型

    二、移位运算符

    位操作符包括右移和左移。只能作用于整数。
    右移操作符包括算术右移和逻辑右移

    1、算术右移为:右边丢弃,左边补原符号位
    2、逻辑右移为:右边丢弃,左边补0
    
    • 1
    • 2

    左移为左边丢弃,右边补0

    操作符解释说明
    >>右移操作符移动的是二进制位。a >> 1,右移一位相当于除以2
    <<左移操作符移动的是二进制位。a << 1,左移一位相当于乘以2

    注意:对于移位运算符,不要移动负数位,这个是标准未定义的。例如:

    int num=10;
    num >> -1; // 错误
    
    • 1
    • 2

    三、位操作符

    操作符解释说明
    &按位与按二进制位运算,同为1则为1,反之为0
    |按位或按二进制位运算,有1则为1,同为0则为0
    ^按位异或按二进制位运算,对应位相同为0,相异为1

    注意:它们的操作数必须是整数

    & 运算示例:

    #include 
    
    int main(){
    
    int a = 3;  // 00000000000000000000000000000011为3的二进制形式
    int b = 5;  // 00000000000000000000000000000101为5的二进制形式
    
    int c = a&b; //&运算后的c为:00000000000000000000000000000001 结果为1
    
    printf("%d", c); // 结果为1
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    | 运算示例:

    #include 
    
    int main(){
    
    int a = 3;  // 00000000000000000000000000000011为3的二进制形式
    int b = 5;  // 00000000000000000000000000000101为5的二进制形式
    
    int c = a|b; //|运算后的c为:00000000000000000000000000000111 结果为7
    
    printf("%d", c); // 结果为7
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ^ 运算符示例:

    #include 
    
    int main(){
    
    int a = 3;  // 00000000000000000000000000000011为3的二进制形式
    int b = 5;  // 00000000000000000000000000000101为5的二进制形式
    
    int c = a^b; //^运算后的c为:00000000000000000000000000000110 结果为6
    
    printf("%d", c); // 结果为6
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.1 交换变量的值

    在不借助第三个变量的情况下,交换两个变量的值

    #include 
    
    int main(){
    
    int a = 3;  // 00000000000000000000000000000011为3的二进制形式
    int b = 5;  // 00000000000000000000000000000101为5的二进制形式
    
    printf("交换前:a=%d, b=%d\n", a, b);
    
    // a^b的结果为:00000000000000000000000000000110 十进制为:6,此时a等于6。
    a = a^b; 
    // 此时a等于6,二进制为:00000000000000000000000000000110 
    //     b等于5,二进制为:00000000000000000000000000000101
    // 再次与b异或的结果为:00000000000000000000000000000011 十进制为:3
    // 将结果赋值给b,此时b的结果为3
    b = a^b;    
    // 此时a等于6,二进制为:00000000000000000000000000000110 
    //     b等于3,二进制为:00000000000000000000000000000011
    // 再次异或的结果为:00000000000000000000000000000101 十进制为:5
    // 将结果赋值给a,完成a与b的交换
    a = a^b;
    
    printf("交换后:a=%d, b=%d", a, b); // 结果a为5,b为3
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    四、赋值操作符

    赋值操作符其实就是一个等号 “=”,在程序中一个等号代表赋值操作符,而两个等号 “==”则表示等号。

    操作符解释说明
    =赋值运算表示右边的值赋给左边,而不是左边的值等于右边的值
    int a = 3;  //表示将3赋值给a,此时a的值就是3
    
    • 1

    五、复合操作符

    操作符解释说明
    +=加等于a += b相当于a= a + b
    -=减等于a -= b相当于a= a - b
    *=乘等于a *= b相当于a= a * b
    /=除等于a /= b相当于a= a / b
    %=取模等于a %= b相当于a= a % b
    >>=右移等于a >>= b相当于a= a >> b
    <<=左移等于a<<= b相当于a= a << b
    &=与等于a &= b相当于a= a & b
    |=或等于a |= b相当于a= a | b
    ^=异或等于a ^= b相当于a= a ^ b

    六、单目操作符

    6.1 操作符介绍

    操作符解释说明
    逻辑反真变成假,假变成真。如果a为真,则 !a为假
    -负值-1,-3等
    +正值+1, +3等
    &取地址&a表示取出a变量的地址
    sizeof操作数的类型长度以字节为单位
    ~对一个数的二进制按位取反看示例
    - -自减前置、后置- -
    ++自加前置、后置++
    *间接访问操作符(解引用操作符)看示例
    (类型)强制类型转换(int)float_num

    6.2 操作符示例

    6.2.1 * 解引用操作符的示例

    #include 
    
    int main(){
    
    int a = 10;
    
    int* p = &a; //将a的地址赋值给指针变量p
    *p = 20;  // *为解引用操作符。表示通过p找到a
    
    printf("a的值为:%d", a);   //a的值为20
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.2.2 ~ 取反操作符示例

    #include 
    
    int main(){
    
    int a = 0;
    
    // a的二进制为:00000000000000000000000000000000
    // 11111111111111111111111111111111 为a的补码
    // 11111111111111111111111111111110 反码
    // 10000000000000000000000000000001 源码值为-1
    printf("a的值为:%d", ~a);   //a的值为-1
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6.2.3 自加自减

    分类:

    前自增	-- ++i
    后自增	-- i++
    
    相同点:最终都使 i 的值加1
    不同点:前自增整体表达式的值是 i 加1之后的值。后自增整体表达式的值是 i 加1之前的值。
    
    前- -同理
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    6.2.3.1 前++使用示例
    #include 
    
    int main(){
    
    int a = 10;
    
    // ++放在前面,先++,后使用
    printf("a的值为:%d", ++a);   //a的值为11
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    6.2.3.2 后++使用示例

    后- -同理

    #include 
    
    int main(){
    
    int a = 10;
    
    // ++放在后面,先使用,再++
    printf("a的值为:%d", a++);   //a的值为10
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    6.2.3.3 综合使用示例
    #include 
    
    int main(void)
    
    {
    	int i, j, k, m;
    	i = j = 3;
    	k = ++i;
    	m = j++;
    	printf("i = %d j = %d k = %d m = %d", i, j, k, m);
    	return 0;
    }
    i = 4 j = 4 k = 4 m = 3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.2.4 强制类型转换

    语法:

    (数据类型)(表达式)
    
    • 1

    功能:

    把表达式的值强制转化为前面所执行的数据类型
    
    • 1

    在这里插入图片描述

    6.2.4.1 强制类型转换示例
    #include 
    
    int main(){
    
    // 3.14为double类型,赋值给int的a精度丢失,且报警告
    // 使用(int)3.14可以将3.14强制转换成int类型
    int a = (int)3.14;
    printf("%d", a);    // a的值为3
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    七、关系操作符

    操作符解释说明
    >大于a > b
    >=大于等于a >= b
    <小于a < b
    <=小于等于a <= b
    !=不等于a != b
    ==等于a == b

    八、逻辑操作符

    操作符解释说明
    &&逻辑与同为真则为真,有一个为零则为假。当计算出左边为假时,右边不再运算
    ||逻辑或同为假则为假,有一个为真则为真。当计算出左边为真时,右边不在运算

    8.1 逻辑与示例

    #include 
    
    int main(){
    
    int a = 3; // a为非零,则为真
    int b = 2; // b为非零,则为真
    
    int c = a && b; // a && b 则同为真则为真,反之为零。
    
    printf("%d", c);	// 结果为:1
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    8.2 逻辑或示例

    #include 
    
    int main(){
    
    int a = 3; // a为非零,则为真
    int b = 0; // b为零,则为假
    
    int c = a || b; // a || b 则同为假则为假,有一个为真则为真。
    
    printf("%d", c); // 结果为:1
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    8.3 面试题示例

    #include 
    
    int main(){
    
    int i=0, a = 0, b = 2, c = 3, d = 4;
    
    // 运算a++时,为先赋值再运算,则a等于0。
    // 当a等于0时,后面不管什么整个表达式都为假,后面不再运算。
    // 然后a再自加1
    i = a++ && ++b && d++;
    printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=1, b=2, c=3, d=4
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    #include 
    
    int main(){
    
    int i=0, a = 1, b = 2, c = 3, d = 4;
    
    // 运算a++时,为先赋值再运算,则a等于1。
    // 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
    // 然后a再自加1
    i = a++ || ++b || d++;
    printf("a=%d\nb=%d\nc=%d\nd=%d", a, b, c, d); // 结果a=2, b=2, c=3, d=4
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    九、条件操作符(三目运算符)

    操作符解释说明
    exp1 ? exp2 ? :exp3条件操作符如果exp1为真,则exp2为整个表达式的结果。如果exp1的结果为假,则exp3为整个表达式的结果

    9.1 条件操作符示例

    #include 
    
    int main(){
    
    int i = 0, a = 4, b = 3;
    
    // 当a大于b时,输出a,反之输出b
    // 相当于:
    // if(a > b){
    //     i = a;
    // }else{
    //     i = b;
    // }
    i = a > b ? a : b;
    printf("i=%d", i); // 结果为i=4
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    十、逗号表达式

    表达式说明
    exp1, exp2, exp3, … expN逗号表达式就是用逗号隔开的多个表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果

    10.1 逗号表达式示例

    #include 
    
    int main(){
    
    int i=0, a = 1, b = 2, c = 3, d = 4;
    
    // 运算a++时,为先赋值再运算,则a等于1。
    // 当a等于1时,后面不管什么整个表达式都为真,后面不再运算。
    // 然后a再自加1
    i = (a > b, a = b + 10, a, b = a + 1); // 逗号表达式
    printf("i=%d", i); // 结果i=13
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    十一、结构体成员操作符

    操作符解释说明
    .结构体成员操作符结构体 . 成员名
    ->结构体指针操作符结构体指针->成员名

    11.1 结构体成员操作符示例

    #include 
    
    // 结构体
    struct Student
    {
        char name[20];
        int age;
        char gender[8];
    };
    
    
    int main(){
    
        // 创建结构体对象
        struct Student s1 = {"张三", 12, "男"};
    
        // 打印其中结构体对象中属性的值
        //s1.gender为取到结构体对象中gender的值
        // 结构体对象.成员名
        printf("%s", s1.gender);    // 结果为:男
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    11.2 结构体指针操作符示例

    #include 
    
    // 结构体
    struct Student
    {
        char name[20];
        int age;
        char gender[8];
    };
    
    
    int main(){
    
        // 创建结构体对象
        struct Student s1 = {"张三", 12, "男"};
    
        // 将s1的地址赋值给ps,因为指针变量可以接收地址
        // 所以ps的类型为Student的指针类型,
        struct Student* ps = &s1;
        // -> 操作符可以使指针指向对象的成员属性
        printf("%s", ps->name);    // 结果为:张三
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    十二、转义字符

    转义字符,所有的ASCII码都可以用 “ \ ” 加数字(一般是8进制数字)来表示。而C中定义了一些字母前加 “” 来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

    在这里插入图片描述

    // \ddd表示1到3位的八进制所代表的任意字符 示例
    #include 
    
    
    int main() {
    
    	// '\46'在ASCII表中代表的时&,所以输出的结果为:&
        printf("%c\n", '\46'); // 输出结果为:&
        // '\044'在ASCII表中代表的时&,所以输出的结果为:$
        printf("%c\n", '\044'); // 输出结果为:$
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    // \xhh表示十六进制所代表的任意字符 示例
    #include 
    
    int main() {
    
    	// '\x25'在ASCII表中代表的时%,所以输出的结果为:%
        printf("%c\n", '\x25'); // 输出结果为:%
       
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:

    1. 区分,斜杠:“/” 与 反斜杠:“” ,此处不可互换。
    2. \xhh 十六进制转义不限制字符个数 ‘\x000000000000F’ == ‘\xF’ 。
    3. "\n"表示两个字符占用一个字节。其他类似

    十三、运算符优先级

    在这里插入图片描述

  • 相关阅读:
    <sa8650>sa8650开发板-之-刷机教程(flashing)
    【JavaEE初阶】 synchronized关键字详解
    在Linux 下制作启动盘以及dd命令使用
    JavaWeb对于JSP基础语法实战详解
    8.Covector Transformation Rules
    L64.linux命令每日一练 -- 第十章 Linux网络管理命令 -- ifconfig和ifup
    面试官:做过性能优化?我:任务切片!
    c语言,c++,java和python这些语言有何区别?编译型编程语言编译语言,解释型编程语言解释型语言
    ARMv7-A 那些事 - 7.栈回溯浅析
    Windows又又又更新?Win 12开发将于下个月开始
  • 原文地址:https://blog.csdn.net/qq_46292926/article/details/127562333