操作符
1.
~表示按(二进制)位取反,即把所有二进制位中数字0变成1,1变成0
例如
int a =0;
printf("~a=%d",~a)
打印出来=-1
到这里就引出了一个新的知识点
即,一个整数的二进制有三种表示方式,而整数在内存中储存的是补码。
下面以此为例子
a = 0 ,因为a是int类型,所以a一共占了四个字节,而一个字节又是8个bit位
所以a在二进制里表示为00000000000000000000000000000000共32个bit位
那么~a的表示为1111111111111111111111111111111111
而~a为整数,在内存中储存的是补码。
所以又引出了一个新的概念:负数的原码,反码,和补码的转换
原码:1111111111111111111111111111111111↓
反码:100000000000000000000000000000↓
补码:100000000000000000000000000001
第一位为符号位,0为正数,1为负数;由原码变成反码则除符号位其他全部按位取反;由反码变为补码则在反码+1
正数来说就比较简单,原码,反码,补码都是一样的
以上所说的原码,反码,补码都是在二进制的基础上完成的。
2.
++操作符,包含前置和后置
例如
int a =10
b=a++,此时printf a,b分别为10,11
b=++a,此时printf a,b分别为11 11
即前置++是先+再使用,后置++是先使用后+
3.
()强制类型转化
例如
int a = 3.2
此时printf(“%d”,a)会报警告
那么我们就可以使用()
即int a =(int)3.2,此时()中的数据类型就是要转化的类型
最后打印出来就是3
4.
关系操作符
等于是两个==判断相等。
5.
逻辑操作符
&&表示在导入的数据中,一个假则全假(0为假,其余自然数为真。)
||表示在导入的数据中,有一个真则全真。
6.
条件操作符(三目操作符)
exp1成立,exp2计算,最后整个表达式的结果是epx2
exp1不成立,exp3计算,最后表达式的结果是exp3
下面举例:
int a = 1
int b = 2
int max = 0
max = a > b ? a : b;(即若a>b,则表达a;若a<=b,则表达b)
7.
逗号表达式:逗号隔开的表达式
例如
int main()
{
(2, 4 + 5, 6);
int a = 0;
int b = 3;
int c = 5;
a=5 c=1 b=3
int d = (a = b + 2, c = a - 4, b = c + 2);
}
//逗号表达式,是从左向右依次计算的
//整个表达式的结果是最后一个表达式的结果
最后printf(“%d”,d)打印出来最后的结果就是3
8.下标引用操作符
下标引用,可以用数组举例子
例如int arr[10]={1,2,3,4,5,6,7,8,9,10}
printf("%d",arr[4]),打印出来结果是5(因为数组编号里从0开始)
9.函数调用操作符
调用函数的时候,函数名后边的()就是函数调用操作符
10.常见关键字
重点
1.关键字是c语言提供的,不能自己创建
2.变量名不能是关键字
int a = 0 自动创建,自动销毁的 - 自动变量,auto表示自动的,每个局部变量都是由auto表示,在变量前被省略掉了。
register.表示建议将关键字放在寄存器中。(大量/频繁被使用的数据,想放在寄存器中,提升效率)register int num = 100;//建议num的值存放在寄存器中
typedef.表示将类型重命名
typedef unsigned int u_int
那么后面再想用 unsigned int 则可以直接用 int u_int表示
static.有三种类型
//static - 静态的
//1. static修饰局部变量
//2. static修饰全局变量
//3. static修饰函数
删去static和留下static最后表达出的分别是10个2和2-11
static修饰局部变量,改变局部变量的生命周期,本质是改变变量储存类型
声明函数只用告诉函数名,返回类型,参数类型。
extern.声明外部符号。
使用:extern int 外部符号
后面就可以使用该符号。
extern,声明函数
与声明外部符号同理
define定义宏(替换成定义符号)