操作符
算数操作符
加:+ 减:- 乘:* 除:/ 取余数:%
注:C语言中,若为整数用除法,则取整数位,
1/2————结果为0
若想取小数,则用浮点型
1.0/2————结果为0
详细用法后续再了解
移位操作符
>> << ————对二进制位进行移位
位操作符
按照二进制位进行计算:
与:& 异或: ^ 或: | 非:~
赋值操作符
= += -= *= /= ^= |= >>= <<=
单目操作符
!:逻辑反操作 -:负值 +:正值 &:取地址
sizeof:操作数的类型长度(以字节为单位) ~:对一个数的二进制位按位取反
--:前置,后置-- ++:前置,后置++ *:间接访问操作符
(类型):强制类型转换
注:a++和++a的区别
int main()
{
int a=10;
int b=a++;
int d=10
int c=++d;
printf("%d",a);//11
printf("%d",b);//10
printf("%d",c);//11
printf("%d",d);//11
return 0;
}
a++:先进行程序运算再加1
++a:先加1再进行程序运算
关系操作符
> >= < <= != ==
逻辑操作符
&&:与
||:或
条件操作符(三目操作符)
exp1?exp2 : exp3
表达式1若成立,则进行表达式2,否则进行表达式3
int a,b;
scanf("%d %d",&a,&b);
a>b?a=5:b=3;
若输入的a大于b,则a被赋值为5,否则b被赋值为3
逗号表达式
exp1, exp2 ,exp3 ,......expN
多条表达式从左向右依次计算,整个表达式会是最后一个表达式的结果
下标引用、函数调用
( ) [ ]
int main()
{
int len=strlen("abc");
printf("%d\n",len);
return 0;
}
下标引用则和数组的使用有关
常见的关键字
由C语言提供,不能自己定义
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed sizeof
static struct switch typedef union unsigned void volatile while
关键字typedef
类型定义,类型重命名
typedef unsigned int uint_32;
//将unsigned int重命名为uint_32,uint_32也是一个类型名
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
关键字static
- 修饰局部变量—称为静态局部变量
void test()
{
int a=5;//若不加上static,则为十个6重复
static int a=5;//加上static,使a的值在每次调用函数后不会重置为5,会保留上一次的运行结果
a++;
printf("%d",a);
}
int main()
{
int i=0;
while(i<10)
{
test();
i++;
}
return 0;
}
static修饰局部变量改变了变量的生命周期 让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
- 修饰全局变量-称为静态全局变量
//在其他文件里add.c
int g_val=2018;
static int g-val=2018
//在主文件里
int main()
{
printf("%d\n",g_val);//结果为2018
printf("%d\n",g-val);//结果不存在,由于用了static,g-val不能被使用,只能在其他文件里
return 0;
}
- 修饰函数-称为静态函数
//在其他文件里add.c
static add(int x,int y)
{
return x+y;
}
int Add(int x,int y)
{
return x+y;
}
//在主文件里test.c
int main()
{
printf("%d\n",Add(2,3));
printf("%d\n",add(2,3));//无法运行,因为用了static,函数不能在其他文件里被调用
return 0;
}
define定义常量和宏
之前有提过define定义常量
#define MAX 100
int main()
{
printf("%d",MAX);
return 0;
}
define还能定义宏(个人理解为函数)
#define ADD(X,Y) X+Y
//define 名称(自变量) 表达式
int main()
{
printf("%d\n", 4*ADD(2, 3));
return 0;
}
指针
内存
内存是电脑上的存储器,计算机中程序的运行都是在内存里进行,那么怎么电脑是怎么有效地使用内存呢?,电脑把内存划分成一个个小的内存单元,每个内存单元的大小是一个字节
所以为了快速的访问到内存的每个单元,就给内存单元进行了编号,这些编号就被称为地址
变量时创建内存中的,每个内存单元都有地址,所以变量也是有地址的
#include <stdio.h>
int main()
{
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
那么怎么存储地址呢?需要定义指针变量
int num = 10;
int *p;//p为一个整形指针变量
p = #
具体使用
#include <stdio.h>
int main()
{
int num = 10;
int *p = #//将num的地址存入p
*p = 20;//给p赋值20,实则就是给num赋值20
printf("%d",num);
return 0;
}
指针变量的大小
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double*));
return 0;
}
结论:指针大小在32位平台是4个字节,64位平台是8个字节。
变量的创建需要向内存申请空间的
结构体
一个基础的用法:描述
struct Stu
{
char name[20];//名字
int age; //年龄
char gender[5]; //性别
char id[15]; //学号
};
结构体的初始化:
//打印结构体信息
struct Stu s = {"张三", 20, "男", "20180101"};
//s 代表命名,分别给结构体内的信息赋值
访问
// .为结构成员访问操作符 常是"名字.信息"
printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);
结构体还能和指针结合一起
//->操作符
//构建一个结构体的指针
struct Stu *ps = &s;
printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);
->代表指针指向的信息
2023.1.06 今日的个人笔记和简略理解
仅为初步了解,C语言还有更多的语法以及用法,待我探索使用