目录
11.操作符
简单介绍一下
算术操作符:
+ ,–,*,/,%
- 它们分别是加、减、乘、除、取模(取余)
/ 除法中有整数除法和浮点数除法,前者比如 int a = 7/2;答案a = 3
而如果我们要执行浮点数除法,就得保证除法和被除数中至少有一个数是浮点数 ,例:7/2.0 或7.0/2 或7.0/2.0
取余操作符 % 顾名思义就是取余数,比如 int a = 7 %3;答案a = 1
但是取余只能用于整型当中,像7%2.0这种编译器是不允许的
移位操作符 :
>> << ,
右移左移,
位操作符:
&、 ^、|
按位与,按位异或,按位或;
这两种操作符都是与二进制位有关,移位的是二进制位,操作的也是二进制位。
赋值操作符:
= += -= *= /= &= ^= |= >>= <<=
第一个 “=”’我们再熟悉不过了;
a+=1;就等于a = a + 1;
同理,a -=1;就等于 a = a - 1;
…
单目操作符:
符号 | 所代表的含义 |
---|---|
! | 逻辑反操作 |
– | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制按位取反 |
++ | 前置、后置-++ |
_ _ | 前置、后置- - |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
啥叫单目操作符?意思是只有一个操作数;像 ==+==这种需要两个数相加的我们称之为双目操作符。
关系操作符:
符号 | 所代表的含义 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 用于测试“不等于” |
== | 用于测试“相等” |
逻辑操作符:
- && 逻辑与
- | | 逻辑或
逻辑与 的意思就是我们生活中的“并且’’ ,
两个操作数都为真才为真;
逻辑或 所对应的是或者,
两个操作数只要有一个为真,则为真;
条件操作符:
exp1 ? exp2 : exp3
这是一个三目操作符,C语言中唯一的一个三目操作符,有三个操作数。
意思很简单,表达式1条件真假?成立执行表达式2,不成立执行3.
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int c = 0;
c = (a > b ? a : b);//如果a大于b,则将a赋值给c,否则将b赋值给c
printf("%d\n", c);
return 0;
}
逗号表达式:
exp1, exp2, exp3, …expN
意思是从左至右依次计算,结果是算到最后一个表达式的结果
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
int c = 5;
int d = (a += 3, b += 4, c += 5, c + 6);//逗号表达式
printf("%d\n", d);
return 0;
}
答案输出为 16
下标引用、函数调用和结构成员操作符
[ ] | () | . | –> |
---|
12.常见关键字
这些关键字是C语言自带的,用户自己是不能创建的
12.1 关键字typedef
意思是类型重命名
//将unsigned int 重命名为uint_66, 所以uint_66也是一个类型名
typedef unsigned int uint_66;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_66 num2 = 0;
return 0;
}
12.2 关键字static
在C语言中:static是用来修饰变量和函数的
- static修饰局部变量,称为静态局部变量
- static修饰全局变量,称为静态全局变量
- static修饰函数,称为静态函数
在C语言学习中我们把内存分为三大块,它们分别是栈区、堆区、静态区
栈区:临时作用的变量都在栈区,如局部变量,形式参数。特点是进入作用域创建,出作用域销毁(并不是真的销毁了,而是还给了操作系统)。
堆区:动态内存分配的地方
静态区:存储全局变量、静态变量,特点是创建好后,直到程序结束才销毁(还给操作系统)
- static 修饰局部变量
请看以下代码:
#include <stdio.h>
void test()
{
int a = 5;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10) {
test();
i++;
}
return 0;
}
在这段代码中,调用test()函数时,因为a是个局部变量,每次调用函数时都需创建,所以它的值始终是5
于是答案是这样的
局部变量在被static修饰过后,从栈区转到了静态区,改变了它的生命周期
#include <stdio.h>
void test()
{
static int a = 5;//静态变量的
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10) {
test();
i++;
}
return 0;
}
答案是这样的:
-
static 修饰全局变量
在C语言中,全局变量具有外部链接属性,在一个项目的其他源文件中,我们只要用extern关键字声明这个全局变量,那这个全局变量就能在这个源文件中使用。
而我们用static修饰了全局变量后,它的外部链接属性改为了内部链接属性,于是这个全局变量只能在自己所在的源文件下使用了 -
static 修饰函数
类似与全局变量,函数也拥有外部链接属性,在其他源文件中被extern声明后可以被使用,而在函数所在源文件函数被static修饰后,它只能在它自己所在的源文件下使用了
12.3 define 定义常量和宏
定义宏其实和定义函数差不多
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
define 定义标识符常量以前讲过,在上面这段代码中,define定义了一个宏,内容是简单的两数相加
#include <stdio.h>
#define ADD(x, y) ((x)+(y))//宏
int Add(int x, int y)//函数
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
printf("%d\n", c);
int d = Add(a, b);
printf("%d\n", d);
return 0;
}
这段代码中c 和 d 的答案都是30,宏和函数所表达的内容是一致的
13. 指针
要学习指针,就得理解内存
内存是电脑上重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分为一个个内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
我们把内存比喻成宿舍楼,每个房间就是这样的内存单元,这样的房间占1个字节,而宿舍楼管那里有一本记事本,记录着到每个房间的路线,也就是每个房间的地址,这个地址就是指针。
int main()
{
int a = 6;
return 0;
}
在这里a是 int 整形变量,所以向内存空间索要了4个字节的内存空间,也就是4个内存单元
#include <stdio.h>
int main()
{
int a = 6;//虽然a占有4个字节,但是当我们&a的时候,拿到的是4个字节中第一个字节的地址
printf("%p\n", &a);
return 0;
}
%p是以地址的形式打印
这里a占有4个字节,也就是四个内存单元,相应的有四个内存编号,但是打印只打印第一个内存单元编号。
我们再加一段代码:
#include <stdio.h>
int main()
{
int a = 6;//虽然a占有4个字节,但是当我们&a的时候,拿到的是4个字节中第一个字节的地址
int * pa = &a;//这里的pa是一个变量,我们把a的地址存放在了里面,叫指针变量
*pa = 7;//解引用操作符
printf("%d",a);
return 0;
}
指针变量意为存放地址的变量;
这里的 * 是在说明pa是指针变量,而前面的 int 实在说明 pa 指向的是一个整形;
在上面的代码中我们加了一句 *pa = 7;还记得吗,*是一个操作符,它被称为解引用操作符,这里的 *pa就是a的意思,所以这段代码的答案显而易见 a = 7;
注意:
32位机器上,地址是32个二进制位,地址要存储的话要四个字节,所以32位机器上指针变量的大小是4个字节;而64位机器上,指针变量存储的字节数是8个字节。
14.结构体
结构体是C语言中非常重要的知识,它能描述那些复杂的对象,这里简单认识一下。
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
#include <stdio.h>
int main()
{
struct Stu s1 = {"张三",20,"男","2022323"};
printf("%s %d %c %s",s1.name,s1.age,s1.sex,s1.id);
return 0;
}
输出语句中s1.name中有个点,你可以把它理解为“xx中的xx”,这句就可以理解为结构体s1中的name项。
今天的文章就到这里啦~
我是Dz,我们下期再见~