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;
示例代码
#includeusing 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 运算符的语法
// 单个对象 指针 = 新类型; //对象数组 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