学习之前,我安装的是Dev-C++软件。
一.位运算
位运算: 用于对整数类型(int,char, long 等)变量的二进制形式的 某一位(bit),或者若干位进行操作。
& 按位与
| 按位或
^ 按位异或
~ 按位取反
<< 左移(左边消失,右边补0)
>> 右移(右边消失,左边补符号位)
位运算的操作数是整数类型或字符型.
1.按位与
1. 将参与运算的两操作数各对应的二进制位进行与 操作,只有对应的两个二进位均为1时,结果的对 应二进制位才为1,否则为0。
例如:表达式“21 & 18 ”的计算结果是16 (即二进制数10000),因为:
21 用二进制表示就是: 0000 0000 0000 0000 0000 0000 0001 0101
18 用二进制表示就是: 0000 0000 0000 0000 0000 0000 0001 0010
二者按位与所得结果是: 0000 0000 0000 0000 0000 0000 0001 0000
即通俗来讲1与1为1,出现0为0
2.按位或
同理如上,0与0为0,出现1为1
3.按位异或
同理如上,不相同为1,相同为0
例如:表达式“21 ^ 18 ”的值是7(即二进制数111)。
21: 0000 0000 0000 0000 0000 0000 0001 0101
18: 0000 0000 0000 0000 0000 0000 0001 0010
21^18: 0000 0000 0000 0000 0000 0000 0000 0111
4.按位取反
把0变1,1变0
例如,表达式“~21”的值是整型数 0xffffffea
21: 0000 0000 0000 0000 0000 0000 0001 0101
~21: 1111 1111 1111 1111 1111 1111 1110 1010
5.左移
a << b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 << 2 = 400。可以看出,a << b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2(这样做要求保证高位的1不被移出)。
6.右移
a >> b表示二进制右移b位(去掉末b位)
二.静态变量,extern变量,关键词const
1.静态变量和静态函数(static)
所有未加static前缀的全局变量(这里的全局变量指在源文件的开头处,不包含在源文件的任何函数内)和函数都具有全局可见性,其它的源文件也能访问。static声明的函数和变量不能在另一个文件中引用,也就是说,如果加了 static,就会对其它源文件隐藏,无法进行调用。
利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static 可以用作函数和变量的前缀,对于函数来讲,static 的作用仅限于隐藏,而对于变量,static 还有下面两个作用。
- 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。在下次使用静态变量时,则不会在去初始化。
- 默认初始化初值为0。在静态存储区共有两种变量存储:全局变量和 static 变量,而且在静态数据区,内存中所有的字节默认值都是0x00
总结:首先 static 的最主要功能是隐藏,其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值0。
2.extern变量
extern最基本的用法是声明全局变量的。这里需要注意两点,一是“声明”,二是“全局变量”;我们先来分析这两个概念。
声明:声明和定义是有区别的。声明不等于定义,声明只是指出了变量的名字,并没有为其分配存储空间;定义指出变量名字同时为变量分配存储空间,定义包含了声明。例如:
extern int i; //声明变量i,但没分配存储空间,还不能使用。
int i; //定义了变量i,并分配了空间,可以使用。
注意:在程序中一个变量可以声明多次,但只能定义一次。
如果声明时有初始化式,也会被当做定义,例如:
extern int i = 5; //定义了变量5
后面的程序中若再出现extern int i = 5;或者int i;的语句,就会出错,因为变量只能定义一次。
全局变量:通俗讲,在函数内部定义的变量称为局部变量,它的作用域是从定义处知道函数结束;在函数外部定义的称为全局变量,它的作用域是从定义处直到文件结束。
注意:不管是全局变量还是局部变量,作用域都是从定义处开始的。例如:
int main()
{
cout<<i<<endl; //错误,会提示变量i未定义
int i=5; //变量i的作用域从这里开始
return 0;
}
3.关键字const
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变。
const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。
const int n=5;
int const n=5;
这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。
const作用:
1:可以用来定义常量,修饰函数参数,修饰函数返回值,且被const修饰的东西,都受到强制保护,可以预防其它代码无意识的进行修改,从而提高了程序的健壮性(是指系统对于规范要求以外的输入能够判断这个输入不符合规范要求,并能有合理的处理方式;
2:使编译器保护那些不希望被修改的参数,防止无意代码的修改,减少bug;
3:给读代码的人传递有用的信息,声明一个参数,是为了告诉用户这个参数的应用目的;
const优点:
1:编译器可以对const进行类型安全检查(所谓的类型安全检查,能将程序集间彼此隔离开来,这种隔离能确保程序集彼此间不会产生负面影响,提高程序的可读性);
2:有些集成化的调试工具可以对const常量进行调试,使编译器对处理内容有了更多的了解,消除了一些隐患。
eg:void hanshu(const int i){.......} 编译器就会知道i是一个不允许被修改的常量
3:可以节省空间,避免不必要的内存分配,因为编译器通常不为const常量分配内存空间,而是将它保存在符号表中,这样就没有了存储于读内存的操作,使效率也得以提高;
4:可以很方便的进行参数的修改和调整,同时避免意义模糊的数字出现;