跳至正文
View Categories

2 min read

1. 变量自增与自减 #

1.1 自加一 #

在之前的学习中,我们已经了解了 i++;

i++ 等价于 i = i+1;

这大大简化了我们的书写;
除了 i++;
现在我们来介绍一个新的语法:++i;

++i 也等价于 i = i+1;

那++i 和 i++ 难道没有区别吗?

先一起来运行如下的代码:并描述一下你看到的现象。

#include <iostream> 
using namespace std;
int main()
{
    int a(20), b(20);
    cout << a++ << endl;
    cout << a   << endl;

    cout << ++b << endl;
    cout << b   << endl;
    return 0;
}

1.2 先加加 和 后加加 #

现象总结如下:

cout << a++    先输出20,然后输出21
------------------------------------
cout << ++b    先输出21,然后输出21

过程拆解:

cout << a++     先输出 a,然后执行 a = a + 1;
-----------------------------------------------
cout << ++b     先执行 b = b + 1;然后输出 b;


怎么记?

在复合语句中,“先++”都是“先执行”

1.3 小结和举例 #


典型语句举例

for 循环
在下面的语法是等价的

因为在C++的底层机制中, ++i 的开销要小于 i++。
所以,为了养成好习惯和便于记忆,我们总结了下面的规则:
大多数情况,优先选用 ++i,效率高,速度快;

++i 的优先级高于四则运算和括号,一般情况下,++i 都是最先计算的。

在复合语句中, ++i(也就是 “先++”)都是“先执行”

1.4 自减一 #

除了 ++ 之外,还有 —

它表示“自减一”。它在复合表达式中的运算规则,和 ++ 完全一样。

int a=50;

int b = a--; // b = 50,然后 a = a - 1,最后 a = 49;

int c = --a; // a = a - 1,这时候 a = 49,最后 c = 49;

小练习,判断下面表达式的值:(大家在电脑上,应该多运行不同的表达式,加深对 ++ — 的认识)

int a(5);


6*a++
6*(a++)
6*++a
6*(++a)
6*++a++
a*++a
++a*++a
++a*--a

2. 位运算 #

2.1 与(&)运算 #

位运算符作用于位,并逐位执行操作。&按位与操作,按二进制位进行”与”运算。运算规则:

0&0=0;   
0&1=0;    
1&0=0;     
1&1=1;

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
(A & B) 将得到 12,即为 0000 1100
“与运算”的特殊用途:
(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数中指定位
方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。
例:设X=10101110,
取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;
还可用来取X的2、4、6位。

2.2 或(|)运算 #

按位或运算符,按二进制位进行”或”运算。运算规则:

0|0=0;   
0|1=1;   
1|0=1;    
1|1=1;

(A | B) 将得到 61,即为 0011 1101
“或运算”特殊作用:
(1)常用来对一个数据的某些位置1。
方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。

2.3 非(~)运算 #

~取反运算符,按二进制位进行”取反”运算。运算规则:

~1=-2;   
~0=-1;

(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
使一个数的最低位为零,可以表示为:a&~1。
~1的值为1111111111111110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

2.4 异或(^)运算 #

异或运算符,按二进制位进行”异或”运算。运算规则:

0^0=0;   
0^1=1;   
1^0=1;  
1^1=0;

假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
(A ^ B) 将得到 49,即为 0011 0001
“异或运算”的特殊作用:
(1)使特定位翻转 找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。
例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。
(2)与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。
从上面的例题可以清楚的看到这一点。

2.5 左移(<<)运算 #

二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
假设如果 A = 60
A << 2 将得到 240,即为 1111 0000
“左移运算”的特殊作用:
左移1位后a = a * 2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

2.6 右移(>>)运算 #

二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
假设如果 A = 60
A >> 2 将得到 15,即为 0000 1111
-14 (即二进制的 11110010)右移两位等于 -4 (即二进制的 11111100)