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=0∑w−1xi2i
其实就是将二进制转化为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 )=⋅−xw−12w−1+i=0∑w−2xi2i
举例:
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])=−0⋅23+0⋅22+0⋅21+1⋅20=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])=−0⋅23+1⋅22+0⋅21+1⋅20=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])=−1⋅23+0⋅22+1⋅21+1⋅20=−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])=−1⋅23+1⋅22+1⋅21+1⋅20=−8+4+2+1=1
另一种计算补码的方法
对整数:直接安慰计算权重和
对负数:保留符号位,对后面每位取反+1
补码数值范围举例
10.位运算说明
验证真值
//二进制转无符号整数
unsigned int B2U(unsigned int num)
{
return (unsigned int)(num);
}
//二进制转有符号整数
int B2T(int num)
{
return (int)(num);
}
为什么要用补码
我们在设计软件系统时总是希望软件系统尽可能很简单通用
。
于是人们希望在只有加法运算器的情况下设计一种方法能计算减法
?
关于位运算的一点补充说明
注意:对于有符号的数,尽可能不要使用右移运算
,因为到底是逻辑右移还是算术右移取决于编译器!