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

补码数值范围举例

C++的运算符与表达式_运算符

10.位运算说明

验证真值

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

为什么要用补码

我们在设计软件系统时总是希望软件系统​​尽可能很简单通用​​。

于是人们希望​​在只有加法运算器的情况下设计一种方法能计算减法​​?

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

C++的运算符与表达式_运算符_02

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