C++的运算符与表达式

1.运算符表达式和基本语句

运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++内置了丰富的运算符,并提供了以下类型的运算符:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符
  • 赋值运算符
  • 杂项运算符

在程序中,运算符是用来操作数据的,因此,这些数据也被称为操作数,使用运算符将操作数连接而成的式子称为表达式
表达式具有如下特点:

  • 常量和变量都是表达式,例如,常量3.14、变量i;
  • 运算符的类型对应表达式的类型,例如,算术运算符对应算术表达式;
  • 每一个表达式都有自己的值,即表达式都有运算结果;

2.算术运算符

+、-、*、/、%、++、–

3.关系运算符

==、!=、>、<、>=、<=

4.逻辑运算符

&&、||、!

5.赋值运算符

=、+=、-=、*=、/=、%=

6.位运算符

运算符作用于位,并逐位执行操作。&、|和^的真值表如下所示:

p q p&q p|q p^q
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
  • 位逻辑运算符:
    &(位 “与”) and
    ^(位 “异或”)
    |(位 “或”) or
    ~(位 “取反”)
  • 移位运算符
    <<(左移)
    >>(右移)
  • 优先级:
    位"与"、位"或"和位"异或"运算符都是双目运算符,其结合性都是从左向右的,优先级高于逻辑运算符,低于比较运算符,且从高到低依次为&、^、|。

7.杂项运算符及运算符合优先级

运算符 描述
sizeof 返回变量的大小
Condition?X:Y 条件运算符
, 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值
.(点)和->(箭头) 成员运算符用于类、结构体和共同体的成员
Cast 强制转换运算符把一种数据类型转换为另一种数据类型。例如。int(2.2000)将返回2(不推荐使用,容易出错)
& 指针运算符&返回变量的地址。例如&a;将给出变量的实际地址
* 指针运算符*指向一个变量。例如,*var将指向变量var

8.语言的注释

  • 单行注释:以//开始,知道行末为止
  • 多行注释:以/*开始,以*/终止

注释的一点原则和建议

1.好的命名和代码本身就是最好的注释;如果代码本身很清楚,不需要额外加注释;
2. 在重要代码段,或复杂代码初先写注释再写代码,这样思路更清晰,同时可以保证代码和注释的一致性
3. 注释不是越多越好,它是对代码的提示,如果要写就要清楚,并且保证和代码一致,如果更新了代码,请更新相应的注释

9.补码

有没有一种办法,可以让你使用加法来计算减法

机器数和真值

  • 机器数
    一个数在计算机中的二进制表示形式,叫做这个数的机器数
    机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1.
    比如:
    十进制数+3,就是00000000000000000000000000000011(32位)
    十进制数-3,就是10000000000000000000000000000011(32位)
    转化为 11111111111111111111111111111101(32位)

  • 真值
    真正的数学意义上的数值。
    因为第一位是符号位,所以机器数的形式值就不等于真正的数值;
    00000000000000000000000000000011 -> +3
    11111111111111111111111111111101 -> -3

无符号数的编码

用一个函数 B 2 U w B2U_w B2Uw( B i n a r y t o U n s i g n e d Binary to Unsigned BinarytoUnsigned)的缩写,长度为 w w w来表示:
B 2 U w ( x ⃗ ) = ⋅ ∑ i = 0 w − 1 x i 2 i B2U_w(\vec x) \stackrel{\cdot}{=}\displaystyle \sum^{w-1}_{i=0}{x_i2^i} B2Uw(x )=i=0w1xi2i
其实就是将二进制转化为10进制,好理解!

有符号数的补码

用函数 B 2 T w B2T_w B2Tw( B i n a r y t o U n s i g n e d Binary to Unsigned BinarytoUnsigned)
B 2 T w ( x ⃗ ) = ⋅ − x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i B2T_w(\vec x) \stackrel{\cdot}{=}-x_{w-1}2^{w-1}+\displaystyle \sum^{w-2}_{i=0}{x_i2^i} B2Tw(x )=xw12w1+i=0w2xi2i
举例:
B 2 T 4 ( [ 0001 ] ) = − 0 ⋅ 2 3 + 0 ⋅ 2 2 + 0 ⋅ 2 1 + 1 ⋅ 2 0 = 0 + 0 + 0 + 1 = 1 B2T_4([0001])=-0\cdot2^3+0\cdot2^2+0\cdot2^1+1\cdot2^0=0+0+0+1=1 B2T4([0001])=023+022+021+120=0+0+0+1=1
B 2 T 4 ( [ 0101 ] ) = − 0 ⋅ 2 3 + 1 ⋅ 2 2 + 0 ⋅ 2 1 + 1 ⋅ 2 0 = 0 + 4 + 0 + 1 = 5 B2T_4([0101])=-0\cdot2^3+1\cdot2^2+0\cdot2^1+1\cdot2^0=0+4+0+1=5 B2T4([0101])=023+122+021+120=0+4+0+1=5
B 2 T 4 ( [ 1011 ] ) = − 1 ⋅ 2 3 + 0 ⋅ 2 2 + 1 ⋅ 2 1 + 1 ⋅ 2 0 = − 8 + 0 + 2 + 1 = − 5 B2T_4([1011])=-1\cdot2^3+0\cdot2^2+1\cdot2^1+1\cdot2^0=-8+0+2+1=-5 B2T4([1011])=123+022+121+120=8+0+2+1=5
B 2 T 4 ( [ 1111 ] ) = − 1 ⋅ 2 3 + 1 ⋅ 2 2 + 1 ⋅ 2 1 + 1 ⋅ 2 0 = − 8 + 4 + 2 + 1 = 1 B2T_4([1111])=-1\cdot2^3+1\cdot2^2+1\cdot2^1+1\cdot2^0=-8+4+2+1=1 B2T4([1111])=123+122+121+120=8+4+2+1=1

另一种计算补码的方法

对整数:直接安慰计算权重和
对负数:保留符号位,对后面每位取反+1

补码数值范围举例

补码数值范围举例

10.位运算说明

验证真值

//二进制转无符号整数
unsigned int B2U(unsigned int num)
{
    
    
	return (unsigned int)(num);
}
//二进制转有符号整数
int B2T(int num)
{
    
    
	return (int)(num);
}

为什么要用补码

我们在设计软件系统时总是希望软件系统尽可能很简单通用
于是人们希望在只有加法运算器的情况下设计一种方法能计算减法

关于位运算的一点补充说明

位运算
注意:对于有符号的数,尽可能不要使用右移运算,因为到底是逻辑右移还是算术右移取决于编译器!

猜你喜欢

转载自blog.csdn.net/XZ2585458279/article/details/109339575
今日推荐