C++ 基础

C++ 主页 C++ 概述 C++ 环境设置 C++ 基本语法 C++ 注释 C++ Hello World C++ 省略命名空间 C++ 标记 C++ 常量/字面量 C++ 关键字 C++ 标识符 C++ 数据类型 C++ 数字数据类型 C++ 字符数据类型 C++ 布尔数据类型 C++ 变量类型 C++ 变量作用域 C++ 多变量 C++ 基本输入/输出 C++ 修饰符类型 C++ 存储类 C++ 数字 C++ 枚举 C++ 枚举类 C++ 引用 C++ 日期和时间

C++ 运算符

C++ 运算符 C++ 算术运算符 C++ 关系运算符 C++ 逻辑运算符 C++ 位运算符 C++ 赋值运算符 C++ sizeof 运算符 C++ 条件运算符 C++ 逗号运算符 C++ 成员运算符 C++ 强制类型转换运算符 C++ 指针运算符 C++ 运算符优先级 C++ 一元运算符

C++ 控制语句

C++ 决策语句 C++ if 语句 C++ if else 语句 C++ 嵌套 if 语句 C++ switch 语句 C++ 嵌套 switch语句 C++ 循环类型 C++ while 循环 C++ for 循环 C++ do while 循环 C++ Foreach 循环 C++ 嵌套循环 C++ break 语句 C++ continue 语句 C++ goto 语句

C++ 字符串

C++ 字符串 C++ 循环遍历字符串 C++ 字符串长度 C++ 字符串连接 C++ 字符串比较

C++ 函数

C++ 函数 C++ 多函数参数 C++ 递归函数 C++ 返回值 C++ 函数重载 C++ 函数重写 C++ 默认参数

C++ 数组

C++ 数组 C++ 多维数组 C++ 指向数组的指针 C++ 将数组传递给函数 C++ 从函数返回数组

C++ 结构 &联合

C++ 结构 C++ 联合

C++ 指针

C++ 指针 C++ 解引用 C++ 修改指针

C++ 类和对象

C++ 面向对象 C++ 类 &对象 C++ 类成员函数 C++ 类访问修饰符 C++ 静态类成员 C++ 静态数据成员 C++ 静态成员函数 C++ 内联函数 C++ this 指针 C++ 友元函数 C++ 指向类的指针

C++ 构造函数

C++ 构造函数 &析构函数 C++ 默认构造函数 C++ 参数化构造函数 C++ 复制构造函数 C++ 构造函数重载 C++ 带默认参数的构造函数 C++ 委托构造函数 C++ 构造函数初始化列表 C++ 使用构造函数动态初始化

C++ 继承

C++ 继承 C++ 多重继承 C++ 多级继承

C++ 面向对象

C++ 重载 C++ 多态性 C++ 抽象 C++ 封装 C++ 接口 C++ 虚函数 C++ 纯虚函数与抽象类

C++ 文件处理

C++ 文件和流 C++ 文件读取

C++ 进阶

C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程 C++ 套接字编程 C++ 并发 C++ 高级概念 C++ Lambda 表达式 C++ unordered_multiset

C++ 实用资源

C++ 问答 C++ 快速指南 C++ 速查表 C++ STL 教程 C++ 标准库 C++ 实用资源 C++ 讨论


C++ 中的一元运算符

一元运算符是指作用于单个操作数并产生新值的运算符。它仅操作或修改单个操作数或值。它用于执行诸如递增、取反或更改值的符号之类的运算。

"一元"一词的由来,是因为这些运算符只需要一个操作数即可执行运算。这使得它不同于需要两个操作数才能执行的二元运算符。

一元运算符列表

运算符 描述 示例 结果
一元加运算符 (+) 这表示一个正值,这不会导致操作数发生实际变化。 x = +5 x = 5
一元否定运算符 (-) 这会对操作数的值取反,从而改变操作数。 x = -(+5) x = -5
增量运算符 (++) 此运算符将其操作数加一,从而使操作数增加一。 x = 5;
x++
x = 6
减量运算符 (--) 此运算符将其操作数减一,从而使操作数减少一。 x = 5;
x--
x = 4
逻辑非/逻辑否定运算符 (!) 此运算符反转其操作数的含义。操作数必须是算术类型或指针类型(或计算结果为算术类型或指针类型的表达式)。操作数被隐式转换为 bool 类型。 x = True;
!x
x = False
按位非运算符 (~) 按位非有时也称为"按位补码"或二进制补码运算符。 x = 5(二进制 0101);
~x
x = -6(0101 + 1 = 0110)
间接运算符 (*)/ 取消引用 它对指针变量进行操作,并返回与指针地址处的值等效的左值。这也称为指针的解引用。 *p = 5 解引用并赋值
地址运算符 (&) 此运算符获取其操作数的地址。 int* ptr = &a; ptr = a 的地址
强制类型转换运算符 () 此运算符提供了一种在特定情况下显式转换对象类型的方法。 int i = (int) 9.57; i = 9
sizeof 运算符 它是一个编译时一元运算符,用于计算其操作数的大小。 sizeof(int) 4 个字节
new 运算符 它是一个内存分配运算符,用于动态分配内存。 int* ptr = new int; 分配内存
delete 运算符 它是一个内存分配运算符,用于释放动态分配的内存。 delete ptr; 释放已分配的内存

C++ 中的一元算术运算符

在 C++ 中,一元算术运算符是对单个操作数进行算术运算的运算符,例如更改符号、递增或递减。

以下是 C++ 中一元算术运算符的列表:

  • 一元加法 (+)
  • 一元减法 (-)
  • 递增 (++)
  • 递减 (--)

一元加法 (+) 运算符

此运算符不会改变操作数的值,它只是简单地返回操作数的原值,无论操作数是负数还是正数。

语法

+operand;

示例代码

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    int y = -4;
    cout << "Returning values using Unary plus" << endl;
    cout << +x << " " << +y << endl;
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Returning values using Unary plus
5 -4

一元减 (-) 运算符

一元减或一元否定运算符用于改变操作数的符号。如果操作数为负数,则变为正数,反之亦然。操作数可以是任意算术类型。

语法

-operand;

示例代码

#include 
using namespace std;

int main() {
    int x = 6;
    int y = -12;
    cout << -x << " " << -y << endl;
    return 0;
}
    

当编译并执行上述代码时,它会产生以下结果 -

-6 12

增量 (++) 运算符

C++ 中的增量运算符用于将操作数的值加一。它有两种形式:

  • 前缀增量 (++x):先增加操作数的值,然后赋值。
  • 后缀增量 (x++):先赋值,然后增加操作数的值。

前缀增量的语法

++operand;

后缀递增的语法

operand++;

示例代码

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    // 前缀增量
    int y = ++x;  // x 先递增,然后赋值给 y
    cout << "Prefix increment:" << endl;
    cout << "x = " << x << ", y = " << y << endl;  

    int a = 5;
    // 后缀递增
    int b = a++; // 先将 a 的值赋给 b,然后对 a 进行递增
    cout << "Postfix increment:" << endl;
    cout << "a = " << a << ", b = " << b << endl;  
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Prefix increment:
x = 6, y = 6
Postfix increment:
a = 6, b = 5

减量 (--) 运算符

C++ 中的减量运算符用于将操作数的值减一,也有两种形式:

  • 前缀减量 (--x): 先将操作数的值减一,然后赋值新的值。
  • 后缀减量 (x--): 先赋值,然后减操作数的值。

前缀减量的语法

--operand;

后缀减量的语法

operand--;

示例代码

#include <iostream>
using namespace std;

int main() {
    int x = 5;
    int y = --x;  // 首先,x 递减到 4,然后赋值给 y
    cout << "x = " << x << " y = " << y << endl;

    int a = 5;
    int b = a--;  // 首先,将 a 赋值给 b,然后减为 4
    cout << "a = " << a << " b = " << b << endl;
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

x = 4 y = 4
a = 4 b = 5

一元逻辑运算符

C++ 中的一元逻辑运算符是用于处理布尔值的运算符,在这里它会反转操作数的含义。操作数必须是算术类型或指针类型(或者是一个计算结果为算术类型或指针类型的表达式)。在这里,操作数会被隐式转换为 bool 类型。

语法

!operand;

示例代码

#include <iostream>
using namespace std;

int main() {
    int x = 10; // 非零值,视为 True
    int y = 0; // 零,视为 False
    
    cout << "!x = " << !x << endl; // x 为 True,因此 !x 将变为 false (0)
    cout << "!y = " << !y << endl; // y 为 False,因此 !y 将变为 true (1)
    
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

!x = 0
!y = 1

按位非运算符 (~)

一元按位NOT 运算符在 C++ 中也称为按位补码或二进制补码运算符,用于执行位级运算。它对变量的各个位进行操作和运算,并生成其操作数的按位二进制补码。操作数必须是整型。

语法

~operand;

示例代码

#include <iostream>
using namespace std;

int main() {
    int x = 5;  
    // 二进制:0000000000000101(16 位表示)
    
    // 应用一元按位非运算符 (~)
    int result = ~x;
    
    // 输出结果
    cout << "x = " << x << endl;       
    cout << "~x = " << result << endl; 
    
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

x = 5
~x = -6

解释

首先, x 被赋值为 5,二进制 5 表示为 0000000000000101(16 位有符号整数表示)。
应用一元按位非 (~) 运算符将操作数的每一位翻转,其中 0 变为 1,1 变为 0。

  • x = 5 => 0000000000000101(5 的二进制)
  • ~x = -6 => 1111111111111010(5 的按位补码)

当使用二进制补码处理有符号整数时,最高有效位(最左边的位)决定数字的符号。

  • 当其为 0 时,数字为正数。
  • 当其为 1 时,数字为负数。

因此,二进制数 111111111111010 的十进制结果为负数。
现在,要检查它的十进制数,加1,等于 0000000000000110。
因此,结果为-6

指针运算符

指针运算符用于在 C++ 中使用指针。这两个指针运算符属于一元运算符,因为它们只能对单个操作数进行操作。

取消引用 (*) 运算符

取消引用,也称为间接运算符,作用于指针变量,访问指针地址中存储的值,并返回指针指向对象的值。

语法

*pointer;

Address-of (&) 运算符

Address-of 运算符返回变量的内存地址。它返回该变量所在的内存地址。

语法

&operand;

示例代码

#include <iostream>
using namespace std;

int main() {
    int num = 10;
    // 使用 Address-of 运算符获取 num 的地址
    int* ptr = # // ptr 现在保存的是 num 的地址

    // 使用 Dereference 运算符访问存储在 num 处的值
    cout << "The value of num: " << num << endl;        
    cout << "The address of num: " << &num << endl;          
    cout << "The address stored in ptr: " << ptr << endl;      
    cout << "The value pointed to by ptr: " << *ptr << endl;
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

The value of num: 10
The address of num: 0x7fff08fa2814
The address stored in ptr: 0x7fff08fa2814
The value pointed to by ptr: 10

类型转换运算符(C++ 风格)

C++ 中的类型转换运算符是一种用于将一种数据类型显式转换为另一种数据类型的方法。

C++ 提供了几种类型转换方法,包括 C 和 C++ 风格的转换:

  • static_cast:用于相关类型之间的转换(例如,int 到 float、float 到 double、char 到 int 以及派生类到基类)。
  • dynamic_cast:用于在多态类层次结构中进行向下转换,并进行运行时检查。
  • const_cast:用于添加/删除 const 限定符。
  • reinterpret_cast:用于低级指针转换。

语法

(type)operand; // C 风格强制转换

示例代码

#include <iostream>
using namespace std;

int main() {
    double a = 10.78; 
    // C 风格转换:将 double 转换为 int(小数部分被丢弃)
    int b = (int)a;
    cout << "Original value of a = " << a << endl;
    cout << "After C-style cast = " << b << endl;
 
    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Original value of a = 10.78
After C-style cast = 10

Sizeof 运算符

C++ 中的 sizeof 运算符用于确定任何数据类型、变量或数据结构的大小(以字节为单位)。它是一个编译时一元运算符。它通常用于查找数据类型的内存消耗、计算数组或结构体的大小,以及使用 malloc 或 new 动态分配内存。

语法

sizeof(type);

示例代码

#include <iostream>
using namespace std;

int main() {
    int a = 10;
    double b = 5.75;
    char c = 'X';

    // 显示每种数据类型和变量的大小
    cout << "Size of int: " << sizeof(a) << " bytes" << endl;
    cout << "Size of double: " << sizeof(b) << " bytes" << endl;
    cout << "Size of char: " << sizeof(c) << " byte" << endl;
    cout << "Size of bool: " << sizeof(true) << " byte" << endl;

    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Size of int: 4 bytes
Size of double: 8 bytes
Size of char: 1 byte
Size of bool: 1 byte

类型特定运算符

C++ 中的类型特定运算符是用于动态内存分配和释放的运算符。

  • new: 用于为任何单个对象或对象数组分配内存。
  • delete: 用于释放使用 new 分配的内存。

new 运算符的语法

// 单个对象
指针 = 新类型;

//对象数组
pointer = new type[size];

delete 运算符的语法

// 单个对象
delete pointer;

//对象数组
delete[] pointer;

示例代码

#include <iostream>
using namespace std;

int main() {
    int* ptr = new int;  
    *ptr = 25;          
    cout << "Dynamically allocated integer: " << *ptr << endl;

    // 使用 delete 释放内存
    delete ptr;

    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Dynamically allocated integer: 25