1. const
1.1 const修饰整型变量,变量的值不可直接更改(常变量)
const int a=10;
a=5;//错误,不可更改
int *p=&a;
*p=6;//通过地址变量解引用后可更改,此时a的值变为6
1.2 const修饰指针变量
int *const p=&a;//此时指针p无法更改,只能存储a的地址
//此时执行以下操作
*p=3;//成功,可以更改p所存储地址对应的变量值
p=&b;//错误,不可更改p的值
const int*p=&a;//修饰指向的内容
//此时执行以下操作
*p=7;//错误,无法通过解引用更改
a=7;//正确,更改成立,可直接更改
p=&b;//正确,可更改p的值
2. static
2.1 static修饰局部变量
此时局部变量为静态局部变量,会改变局部变量的存储位置,使其生命周期变长,但不改变作用域
void test()
{
int x = 0;
x++;
printf("%d ", x);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
输出结果为:1 1 1 1 1 1 1 1 1 1
void test()
{
static int x = 0;
x++;
printf("%d ", x);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
此时输出结果变成了:1 2 3 4 5 6 7 8 9 10
2.2 static修饰全局变量
全局变量范围广,在一个文件中定义以后,在自己的文件内可以直接使用,在另一个文件内进行外部声明后也可使用。
int m=1;//第一个文件内定义变量m
extern int m;//另一个文件内外部声明一下即可使用
但static修饰全局变量后改变了全局变量的链接属性,就只能在一个文件内使用了
2.3 static修饰函数
自定义函数在一个文件内定义后(例如int add(int x;int y)),可以在另一个文件内使用外部声明使用这个函数
extern int add(int x;int y);
与修饰全局变量类似,static修饰函数后声明之后在另一个文件也无法使用该函数
3. 左移、右移操作符<<、>>
b=a<<1;//相当于将a的补码整体向左移一位,符号位不变,然后最右边补一个0。如5变成10,-5变成-10
32位操作系统中,内存中存储的是32个bit位的补码
算数右移:最低位舍去,二进制补码整体向右移动一位,高位补符号位(用于有符号数)
逻辑右移:最低为舍去,二进制补码整体向右移动一位,高位补0(用于无符号数)
左移、右移操作符中一般使用的是算数左移、右移