运算符

单目、双目运算符(一元、二元运算符)

单目运算符和双目运算符是编程中的基本概念,它们的区别主要体现在操作数的数量、优先级以及结合性等方面。

单目运算符只需要一个操作数,单目运算符的优先级通常高于双目运算符。

双目运算符需要两个操作数。常见的双目运算符包括算术运算符、关系运算符、逻辑运算符以及赋值运算符等。在表达式中,不同的双目运算符具有不同的优先级。

算数运算符

这是一些常用的数学运算符,其遵循数学中加减乘除的优先规律,首先进行优先级高的运算,同优先级按运算的结合性运算,括号提高优先级。

单目运算符

+(单目)(正号)

用于放在整数前表示一个正数。

-(单目)(负号)

用于放在整数前表示一个负数。

双目运算符

+(双目)(加法)

用于表示两数相加

-(双目)(减法)

用于表示两数相减

*(乘法)

用于表示两数相乘

/(除法)

用于表示两数相除

%(取模)

A%B表示A/B整除后的余数

类型转换

当两个操作数类型不同时,会发生类型转换。转换原理见2.2的笔记,会将小整数类型的纯右值变为大整数类型。

例如,对于一个整型(int)变量x和另一个双精度浮点型(double)类型变量y:

  • x/3 的结果将会是整型;

  • x/3.0 的结果将会是双精度浮点型;

  • x/y 的结果将会是双精度浮点型;

  • x*1/3 的结果将会是整型;

  • x*1.0/3 的结果将会是双精度浮点型;

自增/自减运算符

自增/自减运算符可放在变量前或变量后面,在变量前称为前缀,在变量后称为后缀,单独使用时前缀后缀无需特别区别,如果需要用到表达式的值则需注意。

++(自增)

A++表示A整数值增加1

-(自减)

A--表示A整数值减少1

表达式中自增/自减运算符的运算顺序

i = 100;

op1 = i++;  // op1 = 100,先 op1 = i,然后 i = i + 1

i = 100;

op2 = ++i;  // op2 = 101,先 i = i + 1,然后赋值 op2

i = 100;

op3 = i--;  // op3 = 100,先赋值 op3,然后 i = i - 1

i = 100;

op4 = --i;  // op4 = 99,先 i = i - 1,然后赋值 op4

关系运算符

关系运算符用于比较两个值或表达式,并返回一个布尔值(truefalse)。以下是C++中常用的关系运算符:

运算符名称
功能
例子

==

检查两个值是否相等

(A==B)不为真

!=

检查两个值是否不相等

(A!=B)为真

>

检查左操作数的值是否大于右操作数的值

(A>B)为真

<

检查左操作数的值是否小于右操作数的值

(A<B)为真

>=

检查左操作数的值是否大于或等于右操作数的值

(A>=B)为真

<=

检查左操作数的值是否小于或等于右操作数的值

(A<=B)为真

逻辑运算符

在C++中,逻辑运算符用于对布尔值进行操作。这些运算符包括:

逻辑与(&&)

如果两个操作数都为真,则结果为真;否则结果为假。

bool a = true;
bool b = false;
bool result = (a && b); // result 为 false

逻辑或(||)

如果两个操作数中至少有一个为真,则结果为真;如果两个操作数都为假,则结果为假。

bool a = true;
bool b = false;
bool result = (a || b); // result 为 true

逻辑非(!)

将操作数的真假取反。如果操作数为真,则结果为假;如果操作数为假,则结果为真。

bool a = true;
bool result = (!a); // result 为 false

赋值运算符

运算符名称
功能
例子

=

将右边的值赋给左边

C=A+B

+=

把右边操作数加上左边操作数的结果赋值给左边操作数

C+=A,即C=C+A

-=

把右边操作数减去左边操作数的结果赋值给左边操作数

C-=A,即C=C-A

*=

把右边操作数乘以左边操作数的结果赋值给左边操作数

C*=A,即C=C*A

/=

把右边操作数除以左边操作数的结果赋值给左边操作数

C/=A,即C=C/A

%=

求两个操作数的模赋值给左边操作数

C%=A,即C=C%A

其他运算符

sizeof

在2.1中提到过,

在实际开发中,可以使用sizeof运算符来获取具体数据类型或变量所占用的字节数。

sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小。

sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。

sizeof (data type)

通过对不同类型的数据使用,可以获得其不同的字节数。

Size of char : 1
Size of int : 4
Size of short int : 2
Size of long int : 4
Size of float : 4
Size of double : 8
Size of wchar_t : 4

条件运算符

Exp1 ? Exp2 : Exp3;

其中,Exp1、Exp2 和 Exp3 是表达式。请注意冒号的使用和位置。? : 表达式的值取决于 Exp1 的计算结果。如果 Exp1 为真,则计算 Exp2 的值,且 Exp2 的计算结果则为整个 ? : 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,且 Exp3 的计算结果则为整个 ? : 表达式的值。

? 被称为三元运算符,因为它需要三个操作数,可以用来代替如下所示的 if-else 语句:

if(condition){
   var = X;
}else{
   var = Y;
}

可被替换为

var = (condition) ? X : Y;

逗号运算符

使用逗号运算符是为了把几个表达式放在一起,整个逗号表达式的值为系列中最后一个表达式的值。从本质上讲,逗号的作用是将一系列运算按顺序执行。

最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃,例如:

var = (count=19, incr=10, count+1);

在这里,首先把 count 赋值为 19,把 incr 赋值为 10,然后把 count 加 1,最后,把最右边表达式 count+1 的计算结果 20 赋给 var。上面表达式中的括号是必需的,因为逗号运算符的优先级低于赋值操作符。

强制转换运算符

强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。

(type) expression 

其中,type 是转换后的数据类型。

例子:

#include <iostream>
using namespace std;
 
int main()
{
   double a = 21.09399;
   float b = 10.20;
   int c ;
 
   c = (int) a;
   cout << "Line 1 - Value of (int)a is :" << c << endl ;
   
   c = (int) b;
   cout << "Line 2 - Value of (int)b is  :" << c << endl ;
   
   return 0;
}

输出是:

Line 1 - Value of (int)a is :21
Line 2 - Value of (int)b is  :10

指针运算符

C++ 提供了两种指针运算符,一种是取地址运算符 &,一种是间接寻址运算符 *。

指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个变量。变量可以是任意的数据类型,包括对象、结构或者指针。

这个在后文会单独说明。

Last updated