当前位置: 首页>编程语言>正文

C语言#初识C语言(三)

1、操作符

2、常见关键词

3、指针

1、操作符

sizeof 操作数的类型长度

#include<stdio.h>
int main()
{
int a=10;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof a);
printf("%d\n",sizeof(int));
//这是sizeof的三种输出方式
int arr[]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",sizeof(arr));
//在数组中,每个数字都有一个类型,数字的类型与变量的类型相同
//所以每一个数字的类型都是int,所以一个数字占4个字节,10个数字占40个字节。
return 0;
}

~ 对一个数的二进制按位取反

​在二进制中1代表负,0代表正。

有符号的整形的二进制数的第一位是符号位,即+或-。

整数在内存中存储的都是补码。

原码是直接按照正负写出来的二进制序列

反码是原码的符号位不变,其他位取反得出的

补码是反码+1得到的。

正数的原码、反码、补码都相同

负数想要输出原码,需要由补码-1的到反码,反码除符号位其他位取反得到原码。

C语言#初识C语言(三),C语言#初识C语言(三)_操作符,第1张

--前置、后置--

++前置、后置++

#inclde<stdio.h>
int main()
{
int a=10;
int b=--a;
int b=++a;
printf("a=%d,b=%d\n",a,b);
printf("a=%d,b=%d\n",a,b);
//--或++在前面时,先将a先-1或+1,再将a的值赋给b
int a1=10;
int b1=a1--;
int b1=a1++;
printf("a1=%d,b1=%d\n",a1,b1);
printf("a1=%d,b1=%d\n",a1,b1);
//--或++在前面时,先将a1的值赋给b1,a1再--或++。
return 0;
}

(类型)强制类型转换

#include<stdio.h>
int main()
{
int a=(int)3.14
//3.14属于双精度类型,在3.14的前面加上括号,括号中放上要改变的类型。
//3.14就被改成int类型了。
printf("%d\n",a);
return 0;
}

关系操作符

>,>=,<,<=,!=,==,

!=用于测试不相等

==用于测试相等

逻辑操作符

在C语言中,0代表假,非0代表真。

&& 逻辑与

#include<stdio.h>
int main()
{
int a=10;
int b=20;
int jg=a&&b;
printf("%d\n",jg)
return 0;
}

&&逻辑与的意思是:a是非0数吗?b也是非0数吗?如果都是非0数,输出1。如果某一方是0,那么输出0。

|| 逻辑或

#incldue<stdio.h>
int main()
{
int a=0;
int b=0;
int jg=a||b;
printf("%d\n",jg);
return 0;
}

||逻辑或的意思是:a和b两方中任意一方是非0数,就输出1。两方都是0,输出0。

条件操作符

exp1?exp2:exp3

这个操作符是一个三目操作符

#include<stdio.h>
int main()
{
int a=10;
int b=20;
int jg=(a>b?a:b);
//意思是a大于b吗?大于的话输出a,不是的话输出b。
return 0;
}

逗号表达式

exp1,exp2,exp3,…expN,

由逗号隔开的一串表达式就是表达式。

下标引用、函数调用和结构成员

[],(),·,->,

2、常见关键字

auto,break,case,char,const,continue,default,do,double,else,enum,extren,float,for,goto,if,int,long,register,teturn,short,signed,sizeof,static,struct,switch,stypedef,union,unsigned,void,volatile,while,

注:自定义变量名不可以和关键字相同

atuo 自动变量

#include<stdio.h>
int main()
{
auto int a=10;
printf("%d\n",a);
return 0;
}

当a在大括号中时生效,离开大括号时失效。所以在每个自动变量前都有一个auto表示这个局部变量是个自动变量,但是每个局部变量都有一个auto,所以就省略不显示了。

register 寄存器变量

#incldue<stdio.h>
int main()
{
register int a=10;
return 0;
}

register是用来向寄存器建议让此变量放在寄存器中,方便我们更快的调用这个变量。但是register是向寄存器建议,因为需要快速调用的变量太多了,需要有寄存器判断是否要放大寄存器中。

signed 定义有符号的变量

unsigned 定义无符号的变量

#include<stdio.h>
int main()
{
signed int a=-10;
unsigend int b=10;
return 0
}

signed可以输出正数或负数

unsigned只可以输出正数

typedef 类型重定义

类型重定义,说直白点就是类型增加了一个别名。使名字较长的类型拥有一个名字较小的别用,使我们调用它更方便快捷。

#include<stdio.h>
int mian()
{
typedef unsigned int=u_int;//这个别名需要自定义。
u_int a=10;
return 0;
}

static 静态

extern 声明外部函数

static 修饰局部变量

#include<stdio.h>
int test()
{
static int b=1;
b++;
pritf("%d\n",b);
}
int main()
{
int a=0
while(a<5)
test();
a++;
return 0;
]

此代码的运算思路:首先在循环中判断a是否小于5,小于5时,进入test中。test中b=1生效,b+1,然后输出b。然后a+1,a变成1。继续重复在循环中判判断。但是在test中int a=1使用了static,使a的生命周期延长,当a离开大括号时将会继续保留,也就是当第二次循环开始a就变成了2。

改变了局部变量的生命周期,使生命周期延长,出了他的作用域也不会被销毁。

static 修饰全局变量

//文件1
#include<stdio.h>
int main()
{
extern a;
int b=a;
pintf("%d\n",b);
return 0;
}
//文件2
static int a=10;

改变了全局变量的作用域,使得全局变量只能在自己的源文件中使用。

static改变函数的链接属性

//文件1
#include<stdio.h>
int main()
{
extern add;
int a=10;
int b=10;
int jg=add(a,b);
printf("%d\n",jg);
}
//文件2
static int add(int x,int y)
{
int z=x+y
return z;
}

使用static使函数的链接属性由外部链接变成了内部链接,所以函数只能在自己的源文件中使用。

#define定义了常量和宏

#define定义了标识符常量

#inlcude<stdio.h>
#define b 100;
int main()
{
int a=b;
printf("%d\n",a);
return 0
}

#define 定义了宏-带参数

注:使用宏时,宏名一般都是大写

#inclde<stdio.h>
#define JG(x,y)(x>y?x:y)
int main()
{
int a=10;
int b=20;
int jg=JG(a,b);
printf("%d\n",jg);
return 0;
}
3、指针

&取地址

*定义指针变量和解引用

指针变量是用来存放内存地址的

指针的类型需要和取地址的变量的类型相同

#include<stdio.h>
int main()
{
int a=10;
int*p=a;
*p=20;//解引用时不需要写任何类型
printf("%d\n",a);
return 0;
}

此代码计算思路:首先a在内存中拥有了一个位置,并且拥有了专属的地址。在这个地方中存放了数字10。其次p也在内存中拥有了一个位置,但是使用*,所以这个地方只能用来存放地址信息并且存放了a的地址信息。再次使用*在p的里面进行解引用,意思是数字20通过p中存放的a的地址信息,进入a的位置里,替换了10。

指针的大小

指针大小在32位平台是4个字节,64位平台是8个字节。


https://www.xamrdz.com/lan/5v71967326.html

相关文章: