操作符:
位操作符:
&(按位与) 两个位都为1时,结果才为1
| (按位或) 两个位都为0时,结果才为0
^(按位异或) 两个位相同为0,相异为1
赋值操作符:
=, +=, -=, *=, /=, &=, ^=, |=, >>=, <<=
a = a+5 —— a += 5
a = a-3 —— a -=3
算术操作符:
+ - * / %
移位操作符:>>(右移操作符) <<(左移操作符)
int a = 9/2; float a = 9/2; float a = 9/2.0;
单目操作符:
只有1个操作数的操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)语法:
{
int a = 10;
printf(“%d\n”, sizeof(int));
printf(“%d\n”,sizeof a);
括号可以省略表示不是函数, 但一般不会省略
int arr[10] = {0};
printf (“%d\n”, sizeof(arr));
--40:计算的是数组的总大小, 单位是字节 printf (“%d\n”, sizeof(arr[0]));
计算数组大小: int sz = sizeof(arr)/sizeof(arr[0]
}
~ 对一个数的二进制按位取反把,所有二进制位中的数字,1变成0,0变成1
语法:
{
int a = 0; printf(“%d\n”, ~a);
整数a
0 二进制:
00000000000000000000000000000000
1111111111111111111111111111111111111 为何输出的结果是-1?
整数(负数)在内存中存储的是补码
一个整数的二进制表示有3种(以-1为例):
原码: 10000000000000000000000000000001
反码: 1111111111111111111111111111111111110(符号位不变,其他按位取反)
补码: 1111111111111111111111111111111111111(反码+1)
整数(正数)原码、反码、补码相同
1、所有正整数的按位取反是其本身+1的负数;
2、所有负整数的按位取反是其本身+1的绝对值;
3、零的按位取反是-1(0在数学界既不是正数也不是负数)
}
-- 前置、后置--
++ 前置、后置++
{
语法:
int a = 10; int b = a++;//后置++,先使用,后++
printf(“%d\n”, b);
printf(“%d\n”, a);
语法: int a = 10; int b = ++a;//前置++,先++,后使用
printf(“%d\n”, b);
printf(“%d\n”, a); ++ 前置、后置++
}
(类型) 强制类型转换
{
#include
int main()
{
int a = 3.14;----int a =(int)3.14;//强制类型转换
printf("%d\n", a);
return 0;
}
//warning C4244: “初始化”: 从“double”转换到“int”,可能丢失数据
}
关系操作符:
{
>, >=, <, <=, !=(用于测试不相等), ==(用于测试相等)
}
逻辑操作符
{
&& 逻辑与 || 逻辑
}
* 间接访问操作符(解引用操作符)
条件操作符
{
exp1 ? exp2 : exp3
max = a > b ? a : b
int main()
{
int a = 3;
int b = 7;
int max = 0;
if (a>b)
{
max = a;
}
else
{
max = b;
}
max = a > b ? a : b;
printf("%d", max);
return 0;
}
逗号表达式
{
exp1,exp2,exp3 … expN
int main()
{
int a = 3;
int b = 7;
int c = 0;
int d = (a = b - c, b = c + a, c = a - b);//结果为最后一个的结果
printf("%d", d);
return 0;
}
下标引用、函数调用和结构成员
{
[] () . ->
[]:下标引用操作符
int arr[10] = {1,2,3,4,5,6,7,8,9,10}
printf(“%d\n”, arr[5] ); //[ ]下标引用操作符
():函数调用操作符
printf(“hehe\n”)//()函数调用操作符
//调用函数的时候,函数名后边的()就是函数调用操作符
}
关键字
{
1.定义:c语言提供的,不能自己创建的,为关键字。比如int、return
2.变量名不能是关键字(int int)
常见关键字: auto:自动变量关键字 --> 每个局部变量都是auto修饰的
int main() {
{
int a = 10;
//进大括号时创建,出大括号时销毁
//自动创建,自动销毁的 – 自动变量
//本身前面都应该有auto,由于局部变量都有auto,所以基本都省略
}
{
常见关键字:
{
break:循环里的跳出关键词,while:循环关键词
case:switch语句中的情况关键词,如星期一,case(星期一)
continue:循环语句,
If:如果,
else:其他,
for:循环,
switch:循环,
default: 默认,
do:do—while循环,
goto:无条件转移关键词
char:字符类型,
float:单精度浮点型,
double:双精度浮点型,
int:整型,
long:长整型,
short:短整型,
signed:有符号(10,-20),
unsigned(%u): 无符号
const:常变量,enum,枚举关键字,
extern:外部变量申明符号,
register:寄存器变量关键词//寄存器的处理速度非常快,因此大量,频繁使用的 数据,放到寄存器中,提升效率
return:返回值函数,
sizeof:求字符串长度,
struct:结构体关键字
union:联合体(共用体)关键字
void:空关键字,volatile:自行了解(听说面试官爱问)
define是不是关键字?No -- 预处理指令
include 是不是关键字? No -- 预处理指令
typedef:类型定义
typedef:顾名思义是类型定义,这里应该理解为类型重命名。
//将unsigned int 重命名为u_int, 所以u_int也是一个类型名 typedef unsigned int u_int;
//(大名:李四——>小名:小四)
int main()
{
unsigned int num = 100;
u_int num2 = 100;//与上面一模一样的意思
return 0;
}
static:静态的
用法:
1.Static修饰局部变量
2.Static修饰全局变量
3.Static修饰函数
【
void test()
{
int a = 1;
a++; printf("%d\n", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test(); i++;
}
return 0;
}
】
【
void test()
{
static int a = 1;
a++;
printf("%d\n", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
】
static修饰局部变量,静态变量修饰符
【
void test()
{
static int a = 1;
a++;
printf("%d\n", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
】
static修饰后的局部变量,出了函数(大括号)后不销 毁,意味着局部变量生命周期变长了
static修饰局部变量,改变了局部变量的生命周期(本 质上是改变了变量的存储类型)
栈区 (局部变量 函数的参数)
堆区( 动态内存分配的)
静态区 (全局变量 static修饰的 静态变量 )
内存 (局部变量 函数的参数,动态内存分配的,全局变量 static修饰的 静态变量)
程序不结束,生命不结束
main.c
extern int gol_a;
int main()
{
printf("%d\n", gol_a);
return 0;
}
add.c
int gol_a = 2021;
static int gol_a = 2021;
static修饰全局变量,是的这个全局变量 只能在自己所在的源文件(.c)内部可 以使用!
其他源文件不能使用!
全局变量,在其他源文件内部可以被使用是因为全局变量具有外部链接属性 。
但被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了!
main.c
extern int Add(int x,int y);
int main()
{
int a = Add(i, k);
printf("%d", a);
return 0;
}
add.c
(static) int Add(int x, int y)
{
return x + y;
}
static修饰函数,使得函数只能在自己的 所在的源文件内部使用,不能在其他源 文件内部使用。 本质上:static是将函数的外部链接数学 变成了内部链接属性(和static修饰全局 变量一样)
define 是一个预处理指令
1.define定义符号
#define MAX 1000
int main()
{
printf("%d\n", MAX);
return 0;
}
2.define定义宏
宏在C语言中是一段有名称的代码片段。无论何时使用到这个宏,宏的内容都会 被这段代码替换掉。
#define 代码名称 代码内容 #
define ADD(X,Y) X+Y----#define ADD(X,Y) ((X)+(Y)
#define Printf printf("Hello world!\n")
int main()
{
Printf;
int sum = 5*ADD(5, 4); ----sum = 5*5+4
printf("%d\n", sum); return 0;
}
}