单目操作符
++ - - ~ & *
++与- -操作符分为前置与后置关系,看如下代码:
int a = 10;
int b = ++a;
printf("%d\n %d", a, b);//看一下a与b的值为多少。
这输入一个前置++问题,代表先进行++操作符的运算,而后进行=操作符的运算。故b=11,a=11.
下面看一个后置++代码:
int a = 10;
int b = a++;
printf("a=%d\nb=%d", a, b);
此时++后置,先进行=运算符的运算,而后进行++运算符的运算。故b=10,a=11.
运算符- -同理。
—————————————————————————————
下面介绍~运算符,该运算符代表对变量按位取反。
提到这个运算符就要介绍一下数据在内存中怎么存储:
①数据在内存中以二进制的方式存储
②数据在内存中存储的是本身的补码形式(正数原码 反码 补码相同,这里只介绍负数形式)
下面来看一段代码
int a = 0;
int b = 1;
printf("~a=%d\n~b=%d", ~a, ~b);
根据上面数据如何存储来分析这道题:
—————————————————————————————
&与*操作符
放到介绍指针时一起介绍。
① sizeof关键字实现:
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
② struct关键字实现:
struct代表结构体,以人为例,可以细分为一个人的姓名,身高,体重,年龄。
struct Human
{
char name[20];//记录名字
int tall;//记录身高
int age;//记录年龄
int weight;//记录体重
};
//以李四举例
struct Human lisi = { "李四", 175, 18, 70 };
struct Human *p = &lisi;
printf("姓名:%s\n身高:%d\n年龄:%d\n体重:%d\n", p->name, p->tall, p->age, p->weight);
③ typedef关键字实现
struct Human
{
char name[20];//记录名字
int tall;//记录身高
int age;//记录年龄
int weight;//记录体重
};
typedef struct Human student;//——————————
//以李四举例
student lisi = { "李四", 175, 18, 70 };
student *p = &lisi;
printf("姓名:%s\n身高:%d\n年龄:%d\n体重:%d\n", p->name, p->tall, p->age, p->weight);
相当于给我们创建的结构体变量取个别名为“student”,“student”代表着我们创建的结构体变量。
④ static关键字的用法
tip1:用来修饰局部变量
tip2:用来修饰全局变量
tip3:用来修饰函数
上次的文章有提到,局部变量与全局变量均存在作用域与生命周期,static用来改变它们的作用域与生命周期,来看一段代码
int sum(int a)
{
int c = 0;
static int b = 3;
c += 1;
b += 2;
return (a + b + c);
}
int main()
{
int i;
int a = 2;
for (i = 0; i < 5; i++)
{
printf("%d,", sum(a));
}
分析: 根据上个文章所提到,变量出了所在的{}范围就会销毁,故不妨假设打印出了八个8,。来看真正结果
和我们所假设的不同,static在里面“作怪”,可推知,static修饰的局部变量的生命周期会被延长至与整个程序的生命周期相同,故出了原作用域{}后并没有被销毁
————————
来看static修饰的全局变量:
全局变量的作用域是整个工程,生命周期同程序相同。
下面是用static修饰后
可以看到无法解析变量n。故可知道static修饰全局变量后,全局变量不再作用于整个工程,而作用于自己所在的文件中。
———————
先看没有修饰函数时
这是一个求和函数,在一个文件中创建与定义,在另一个文件中调用,但当被static修饰后
这个求和函数无法被调用,故函数同全局变量一样,被static修饰后都只能作用于本文件内。