03.运算符

目录介绍
  • 3.1 运算符介绍
  • 3.2 算术运算符
    • 3.2.1 加减乘除
    • 3.2.2 取模
    • 3.2.3 递增
  • 3.3 赋值运算符
  • 3.4 比较运算符
  • 3.5 逻辑运算符
    • 3.5.1 逻辑非
    • 3.5.2 逻辑与
    • 3.5.3 逻辑或
  • 3.6 位运算符
  • 3.7 运算符优先级
  • 3.8 sizeof运算符
    • 3.8.1 sizeof介绍
    • 3.8.2 基本用法
    • 3.8.3 sizeof与数组
    • 3.8.4 sizeof与结构体
    • 3.8.5 sizeof与类
    • 3.8.6 sizeof与指针
    • 3.8.7 sizeof与字符串
    • 3.8.8 sizeof动态内存
  • 3.9 练习题
    • 3.9.5 计算数据内存大小

3.1 运算符介绍

作用:用于执行代码的运算

本章我们主要讲解以下几类运算符:

运算符类型作用
算术运算符用于处理四则运算
赋值运算符用于将表达式的值赋给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值

3.2 算术运算符

作用:用于处理四则运算

算术运算符包括以下符号:

运算符术语示例结果
+正号+33
-负号-3-3
+10 + 515
-10 - 55
*10 * 550
/10 / 52
%取模(取余)10 % 31
++前置递增a=2; b=++a;a=3; b=3;
++后置递增a=2; b=a++;a=3; b=2;
--前置递减a=2; b=--a;a=1; b=1;
--后置递减a=2; b=a--;a=1; b=2;

当操作数的类型不同时,C++会进行隐式类型转换以匹配操作数的类型。在进行算术运算时,确保操作数的类型和运算结果的类型是符合预期的,以避免数据丢失或错误的结果。

3.2.1 加减乘除

示例1:加减乘除

int main() {
    int a1 = 10;
    int b1 = 3;
    cout << a1 + b1 << endl;
    cout << a1 - b1 << endl;
    cout << a1 * b1 << endl;
    cout << a1 / b1 << endl;  //两个整数相除结果依然是整数

    int a2 = 10;
    int b2 = 20;
    cout << a2 / b2 << endl;

    int a3 = 10;
    int b3 = 0;
    //cout << a3 / b3 << endl; //报错,除数不可以为0

    //两个小数可以相除
    double d1 = 0.5;
    double d2 = 0.25;
    cout << d1 / d2 << endl;
    return 0;
}

3.2.2 取模

示例2:取模

int main() {
    int a1 = 10;
    int b1 = 3;
    cout << a1 % b1 << endl;

    int a2 = 10;
    int b2 = 20;
    cout << a2 % b2 << endl;

    int a3 = 10;
    int b3 = 0;
    cout << a3 % b3 << endl; //取模运算时,除数也不能为0

    //两个小数不可以取模
    double d1 = 3.14;
    double d2 = 1.1;
    //cout << d1 % d2 << endl;
    return 0;
}

3.2.3 递增

示例3:递增

int main() {
    //后置递增
    int a = 10;
    a++; //等价于a = a + 1
    cout << a << endl; // 11

    //前置递增
    int b = 10;
    ++b;
    cout << b << endl; // 11

    //区别
    //前置递增先对变量进行++,再计算表达式
    int a2 = 10;
    int b2 = ++a2 * 10;
    cout << b2 << endl;

    //后置递增先计算表达式,后对变量进行++
    int a3 = 10;
    int b3 = a3++ * 10;
    cout << b3 << endl;
    return 0;
}

3.3 赋值运算符

作用:用于将表达式的值赋给变量

赋值运算符包括以下几个符号:

运算符术语示例结果
=赋值a=2; b=3;a=2; b=3;
+=加等于a=0; a+=2;a=2;
-=减等于a=5; a-=3;a=2;
*=乘等于a=2; a*=2;a=4;
/=除等于a=4; a/=2;a=2;
%=模等于a=3; a%2;a=1;

示例:

#include <iostream>
using namespace std;

int main() {
    // =
    int a = 10;
    a = 100;
    cout << "a = " << a << endl;

    // +=
    a = 10;
    a += 2; // a = a + 2;
    cout << "a = " << a << endl;

    // -=
    a = 10;
    a -= 2; // a = a - 2
    cout << "a = " << a << endl;

    // *=
    a = 10;
    a *= 2; // a = a * 2
    cout << "a = " << a << endl;

    // /=
    a = 10;
    a /= 2;  // a = a / 2;
    cout << "a = " << a << endl;

    // %=
    a = 10;
    a %= 2;  // a = a % 2;
    cout << "a = " << a << endl;
    return 0;
}

3.4 比较运算符

作用:用于表达式的比较,并返回一个真值或假值

比较运算符有以下符号:

运算符术语示例结果
==相等于4 == 30
!=不等于4 != 31
<小于4 < 30
>大于4 > 31
<=小于等于4 <= 30
>=大于等于4 >= 11

示例:

#include <iostream>
using namespace std;

//比较运算符
int main() {
    int a = 10;
    int b = 20;
    cout << (a == b) << endl; // 0
    cout << (a != b) << endl; // 1
    cout << (a > b) << endl; // 0
    cout << (a < b) << endl; // 1
    cout << (a >= b) << endl; // 0
    cout << (a <= b) << endl; // 1
    return 0;
}

3.5 逻辑运算符

作用:用于根据表达式的值返回真值或假值

逻辑运算符有以下符号:

运算符描述示例结果
&&逻辑与a && b如果a和b都为真,则结果为真,否则为假。
``逻辑或`ab`如果a和b有一个为真,则结果为真,二者都为假时,结果为假。
!逻辑非!a如果a为假,则!a为真; 如果a为真,则!a为假。

3.5.1 逻辑非

示例1:逻辑非,逻辑非运算符 !:用于取反操作,将真变为假,将假变为真。

int main() {
    int a = 10;
    cout << !a << endl; // 0
    cout << !!a << endl; // 1
    return 0;
}

3.5.2 逻辑与

示例2:逻辑与,逻辑与运算符 &&:当两个操作数都为真时,结果为真;否则结果为假。

int main() {
    int a = 10;
    int b = 10;
    cout << (a && b) << endl;// 1
    a = 10;
    b = 0;
    cout << (a && b) << endl;// 0
    a = 0;
    b = 0;
    cout << (a && b) << endl;// 0
    return 0;
}

3.5.3 逻辑或

示例3:逻辑或,逻辑或运算符 ||:当两个操作数中至少有一个为真时,结果为真;否则结果为假。

//逻辑运算符  --- 或
int main() {
    int a = 10;
    int b = 10;
    cout << (a || b) << endl;// 1
    a = 10;
    b = 0;
    cout << (a || b) << endl;// 1
    a = 0;
    b = 0;
    cout << (a || b) << endl;// 0
    return 0;
}

3.6 位运算符

用于对二进制位进行操作。

运算符描述示例
&按位与a & b
``按位或`ab`
^按位异或a ^ b
~按位取反~a
<<左移a << b
>>右移a >> b

示例

int m = 5, n = 3; // 5: 0101, 3: 0011
cout << "m & n: " << (m & n) << endl; // 1 (0001)
cout << "m | n: " << (m | n) << endl; // 7 (0111)
cout << "m ^ n: " << (m ^ n) << endl; // 6 (0110)
cout << "~m: " << ~m << endl;         // -6 (补码表示)
cout << "m << 1: " << (m << 1) << endl; // 10 (1010)
cout << "m >> 1: " << (m >> 1) << endl; // 2 (0010)

3.7 运算符优先级

运算符的优先级决定了表达式中运算的顺序。优先级高的运算符先执行。以下是常见运算符的优先级(从高到低):

  1. ()(括号)
  2. ++--(自增、自减)
  3. */%(乘法、除法、取模)
  4. +-(加法、减法)
  5. <<>>(左移、右移)
  6. <<=>>=(关系运算符)
  7. ==!=(相等性运算符)
  8. &|^(位运算符)
  9. &&||(逻辑运算符)
  10. =+=-= 等(赋值运算符)

3.8 sizeof运算符

3.8.1 sizeof介绍

在 C++ 中,sizeof 是一个运算符,用于获取数据类型或变量所占用的内存大小(以字节为单位)。sizeof 在编译时计算,因此不会影响程序的运行时性能。

3.8.2 基本用法

sizeof 可以用于以下两种形式:

  1. sizeof(类型):获取某种数据类型的大小。
  2. sizeof(表达式):获取表达式结果类型的大小。

3.8.3 sizeof与数组

sizeof 可以用于计算数组的总大小或数组元素的大小。

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    cout << "sizeof(arr): " << sizeof(arr) << " bytes" << endl; // 数组总大小
    cout << "sizeof(arr[0]): " << sizeof(arr[0]) << " bytes" << endl; // 单个元素大小
    cout << "Number of elements in arr: " << sizeof(arr) / sizeof(arr[0]) << endl; // 数组元素个数
    return 0;
}

输出

sizeof(arr): 20 bytes
sizeof(arr[0]): 4 bytes
Number of elements in arr: 5

3.8.4 sizeof与结构体

sizeof 可以用于计算结构体的大小。注意,结构体的大小可能会受到内存对齐的影响。示例

#include <iostream>
using namespace std;

struct Point {
    int x;
    int y;
};

struct PackedPoint {
    int x;
    int y;
} __attribute__((packed)); // 取消内存对齐(仅在某些编译器中有效)

int main() {
    cout << "sizeof(Point): " << sizeof(Point) << " bytes" << endl;
    cout << "sizeof(PackedPoint): " << sizeof(PackedPoint) << " bytes" << endl;

    return 0;
}

输出

sizeof(Point): 8 bytes
sizeof(PackedPoint): 8 bytes

3.8.5 sizeof与类

sizeof 可以用于计算类的大小。类的大小包括成员变量的大小,并可能受到内存对齐和虚函数表(如果有虚函数)的影响。示例

#include <iostream>
using namespace std;

class MyClass {
    int a;
    double b;
};

class MyClassWithVirtual {
    int a;
    double b;
    virtual void foo() {}
};

int main() {
    cout << "sizeof(MyClass): " << sizeof(MyClass) << " bytes" << endl;
    cout << "sizeof(MyClassWithVirtual): " << sizeof(MyClassWithVirtual) << " bytes" << endl;

    return 0;
}

输出

sizeof(MyClass): 16 bytes
sizeof(MyClassWithVirtual): 24 bytes

3.8.6 sizeof与指针

sizeof 用于指针时,返回指针本身的大小,而不是指针指向的对象的大小。示例

#include <iostream>
using namespace std;

int main() {
    int* ptr = nullptr;
    cout << "sizeof(ptr): " << sizeof(ptr) << " bytes" << endl;

    return 0;
}

输出

sizeof(ptr): 8 bytes

3.8.7 sizeof与字符串

sizeof 用于字符串时,返回字符串数组的大小,而不是字符串的长度。示例

#include <iostream>
using namespace std;

int main() {
    char str[] = "Hello";
    cout << "sizeof(str): " << sizeof(str) << " bytes" << endl; // 包括 ''
    cout << "strlen(str): " << strlen(str) << " characters" << endl; // 不包括 ''

    return 0;
}

输出

sizeof(str): 6 bytes
strlen(str): 5 characters

3.8.8 sizeof动态内存

sizeof 不能用于计算动态分配内存的大小,因为它只能计算编译时已知的类型或变量的大小。示例

#include <iostream>
using namespace std;

int main() {
    int* arr = new int[10];
    cout << "sizeof(arr): " << sizeof(arr) << " bytes" << endl; // 指针大小,不是数组大小
    delete[] arr;

    return 0;
}

输出

sizeof(arr): 8 bytes

3.9 练习题

3.9.5 计算数据内存大小

作用:利用sizeof关键字可以==统计数据类型所占内存大小==

语法: sizeof( 数据类型 / 变量)

示例:

#include <iostream>
using namespace std;
int main() {
    cout << "short 类型所占内存空间为: " << sizeof(short) << endl;
    cout << "int 类型所占内存空间为: " << sizeof(int) << endl;
    cout << "long 类型所占内存空间为: " << sizeof(long) << endl;
    cout << "long long 类型所占内存空间为: " << sizeof(long long) << endl;
    return 0;
}
//short 类型所占内存空间为: 2
//int 类型所占内存空间为: 4
//long 类型所占内存空间为: 8
//long long 类型所占内存空间为: 8
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]