Skip to content

第三章 运算符

1、运算符 operator

  • 算数运算符
  • 赋值运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 条件运算符
  • sizeof运算符

按照操作数个数分

  • 一元运算符
  • 二元运算符
  • 三元运算符

2、算数运算符

+-*/%++--

除法运算

c
#include <stdio.h>


int main(int argc, char *argv[]) {
    int a = 12;
    int b = 5;


    // int / int => int
    int c = a / b;
    printf("%d\n", c);
    // 结果:2


    // (int + double) => double; double / int => double
    double d = (a + 0.0) / b;

    printf("%lf\n", d);
    // 结果: 2.400000

    return 0;
}

取模

c
#include <stdio.h>


int main(int argc, char *argv[]) {
    int a = 13;
    int b = 5;

    // 结果与被模数相同
    int c = a % b;
    printf("%d\n", c);
    // 结果:3

    return 0;
}

自增a++

c
#include <stdio.h>


int main() {
    int a = 1;
    int b = a++;

    printf("a = %d; b = %d\n", a, b);
    // a = 2; b = 1

    return 0;
}

自增++a

c
#include <stdio.h>


int main() {
    int a = 1;
    int b = ++a;

    printf("a = %d; b = %d\n", a, b);
    // a = 2; b = 2

    return 0;
}

示例:打印一个三位整数的个位、十位、百位

c
#include <stdio.h>


int main() {
    int a = 123;
    
    printf("个位:%d\n", a % 10);
    printf("十位:%d\n", (a / 10) % 10);
    printf("百位:%d\n", a / 100);

    return 0;
}

输出

c
个位:3
十位:2
百位:1

示例:89小时是多少天零多少小时?

c
#include <stdio.h>

int main() {
    int hours = 89;

    int days = hours / 24;
    int hour = hours % 24;

    printf("天:%d\n", days);
    printf("小时:%d\n", hour);

    return 0;
}

输出

c
天:3
小时:17

3、赋值运算符

支持:=+=-=*=/=%=

c
#include <stdio.h>

int main() {
    int x = 100;
    x *= 10;  // 等价于:x = x * 10
    printf("x = %d\n", x); // x = 1000

    return 0;
}

示例:交换两个变量的值

c
#include <stdio.h>

int main() {
    int x = 1;
    int y = 2;

    // 交换x和y的值
    int temp;
    temp = x;
    x = y;
    y = temp;

    printf("x = %d; y = %d\n", x, y);
    // x = 2; y = 1
    return 0;
}

4、关系运算符

支持:>>=<<===!=

c
#include <stdio.h>

int main() {
    int x = 1;
    int y = 2;

    if(x > y) {
        printf("x > y");
    } else {
        printf("x < y");
    }
    // 输出:x < y
    return 0;
}

5、逻辑运算符

支持:&&||!

c
#include <stdio.h>

int main() {
    int x = 5;

    if(x > 0 && x < 10) {
        printf("0 < x < 10");
    }
    // 输出:0 < x < 10

    return 0;
}

短路现象

c
#include <stdio.h>

int main() {
    int x = 5;

    // 左边为真,右边就没有执行
    if(x > 0 || x++) {
        // do something
    }

    printf("%d", x);
    // 输出:5

    return 0;
}
c
#include <stdio.h>

int main() {
    int x = 5;

    // 左边为假,右边就没有执行
    if(x < 0 && x++) {
        // do something
    }

    printf("%d", x);
    // 输出:5

    return 0;
}

6、位运算符

支持:<<>>&|~^

左移补零

c
3 << 4 相当于 3 * 2^4 = 3 * 16 = 48

// 负数移动的是补码
-3 << 4 相当于 -3 * 2^4 = 3 * 16 = -48

右移,正数补0,负数补1

c
69 >> 4 相当于 69 / (2 ^ 4) = 69 / 16 = 4

// 负数移动的是补码
-69 >> 4 相当于 -69 / (2 ^ 4) = -69 / 16 = -5

示例:高效计算2 * 8的值

c
#include <stdio.h>

int main() {
    // 2 * 8
    printf("%d", 2 << 3);
    // 输出:16

    return 0;
}

示例:清空高4位,保留低4位

c
#include <stdio.h>

int main() {
    char c = 53; // 0b00110101
    c = c & 15 ; // 0b00001111

    printf("%d", c); // 0b00000101
    // 输出:5

    return 0;
}

7、条件运算符

c
#include <stdio.h>

int main() {
    // 三目运算符
    int a = 15 > 10 ? 15 : 10;

    printf("%d", a);
    // 输出:15

    return 0;
}

8、sizeof运算符

返回占用字节数

c
#include <stdio.h>

int main() {
    // 1、变量
    int a = 10;
    printf("%d\n", sizeof(a));
    // 输出:4

    // 2、类型
    printf("%d\n", sizeof(int));
    // 输出:4

    // 3、常量
    printf("%d\n", sizeof(10));
    // 输出:4

    return 0;
}

定义

c
// size_t 系统决定,可能的类型:unsigned int,unsigned long
size_t sizeof(var);

示例

c
#include <stdio.h>

int main() {
    // size_t类型的占位符:%zd、%zu
    size_t size = sizeof(int);
    printf("%zd\n", size);
    // 输出:4

    return 0;
}

9、运算符优先级

使用() 控制优先级